小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

485通訊與MODBUS的區(qū)別與聯(lián)系

 無痕qf7uhpy2er 2021-04-09

最近做智能檢測的項目,設(shè)備、串口之間的通訊比較多,一會兒485,一會兒modbus RTU,有點暈了,這里重新梳理一下RS485、485通訊協(xié)議、ModBus通訊協(xié)議、Modbus Rtu通訊這幾個點的聯(lián)系和區(qū)別。

先說RS485吧,RS485是一個工業(yè)常用的物理接口,是物理層的硬件設(shè)備(串口)。是在電腦設(shè)置上看得到的(windows系統(tǒng)-我的電腦-設(shè)備管理器)設(shè)備。

Modbus是一種國際標準的通訊協(xié)議,一般用于不同廠商設(shè)備之間進行數(shù)據(jù)交換,是應用層的軟件協(xié)議,不能自己單獨存在,必須要依賴于硬件設(shè)備作為實現(xiàn)平臺。不同的硬件具有不同的電氣特性和連接方式,比如RS232、RS485??梢园袽odbus比作英語,RS232比作印度人,RS485比作美國人,印度人之間講英語時,理解為基于RS232的modbus通信,美國人之間講英語時,理解為基于RS485的modbus通信。

兩臺設(shè)備之間通過Modbus協(xié)議傳輸數(shù)據(jù),需要硬件接口,于是就有了RS232\RS422\RS485等,其中RS485傳輸距離遠,成為現(xiàn)在最主流的工業(yè)現(xiàn)場硬件接口。

Modbus按照一般維度分為Modbus Rtu、Modbus ASCII、Modbus TCP三種模式。

從接口類型維度來說,Modbus Rtu和ASCII基于串行鏈路,屬于串行通訊口(serial port),Mobus tcp基于TCP/IP協(xié)議,屬于網(wǎng)絡(以太網(wǎng))通訊口。

協(xié)議分為硬件協(xié)議和軟件協(xié)議。而通訊協(xié)議屬于軟件協(xié)議,它包含報頭包圍的格式,MODBUS是應用層的通訊協(xié)議,主要用于傳送和接收文件包的格式。而RS232,RS485是物理層的串行接口,它可以支持幾十種通訊協(xié)議,MODBUS只是其中的一種。

Modbus的特征:(1) 主從協(xié)議方式(master/slave)

                           (2) 通訊規(guī)約:初始結(jié)構(gòu)-地址碼-功能碼-數(shù)據(jù)區(qū)-校驗碼-結(jié)束結(jié)構(gòu)

                           (3) modbus協(xié)議本質(zhì)是對寄存器讀寫,通過指定寄存器地址,來交換數(shù)據(jù)

寫了一大堆概念性的東西,現(xiàn)在在面對實際問題,以下是供應商給出來的一句話:

大概需求是我需要通過485串口,給供應商的設(shè)備發(fā)送一個速度信號,這個速度信號的格式要求,是485格式,波特率、奇偶校驗、8個數(shù)據(jù)位這些就不用再說了,了解下串口基礎(chǔ)就知道了,一般都是N81,即“無奇偶校驗、8個數(shù)據(jù)位、1個停止位”,問題的關(guān)鍵在于這個“485格式”。RS485做為一個標準串口通訊,是有自己的標準通信格式的。

可以看到,跟modbus是有些相似的,除了自己的格式外,也可以選擇遵循Modbus通訊規(guī)約,更多的是使用modbus RTU模式通訊格式。

上圖是modbus rtu的通訊規(guī)約,接下里的任務,是搞懂485通訊規(guī)約和modbus rtu通訊規(guī)約的區(qū)別,兩種格式到底區(qū)別在哪里。為什么供應商選擇用485格式,而不是使用的更廣泛的modbus rtu?這兩者之間的優(yōu)缺點又分別是什么?

補充1:

所謂rs485通訊協(xié)議,屬于硬件層協(xié)議。硬件層管什么呢?決定數(shù)據(jù)如何傳輸,比如2進制的數(shù)只有0和1,那么如果1個字節(jié)現(xiàn)在是'0110 0011',現(xiàn)在這個字節(jié)里的0怎么傳輸和表達,1怎么傳輸和表達,比如rs232就規(guī)定了電壓x伏就表示0,y伏表示1。再比如要選擇多少條線來傳輸,選擇什么材質(zhì)的線來傳輸,這就是硬件層協(xié)議規(guī)定的事情。

同樣RS485通訊協(xié)議也是個硬件層協(xié)議,實際上是關(guān)于電平、電壓的約定。搞軟件的不一定看得懂,特別是應用層軟件。

比如這樣,再比如這樣,亦或是這樣反正我是看不懂的

但是我弄清楚了什么叫所謂的RS485通訊協(xié)議,是硬件的、關(guān)于電平、電壓的,一個規(guī)約,跟應用軟件沒半毛錢關(guān)系。

補充2(2020.12.14):

起始我糾結(jié)了半天,就是被串口通訊和modbus rtu搞暈了,一周之后回過頭來看,就顯得有點笨,但是還是硬著頭皮補充完整吧。

串口通訊和Modbus rtu的有哪些區(qū)別,又有哪些共同點呢?

從概念上來說,都是串口,rtu起始就是基于串口的,所以共同點就是,rtu和串口通訊,都要設(shè)置波特率、數(shù)據(jù)位、停止位、奇偶校驗等

  1. // 波特率常量
  2. private final static int BAUD_RATE = 9600;
  3. // 廣播地址
  4. // private final static int broadcast_SLAVE_ADDRESS = 0;
  5. // 數(shù)據(jù)位
  6. private final static int DATABITS_8 = 8;
  7. // 停止位
  8. private final static int STOPBITS_1 = 1;
  9. // 奇偶校驗
  10. private final static int PARITY_NONE = 0;

不同點是,串口通訊需要串口對象,而modbus需要從機地址(設(shè)備地址),如果是廣播模式就需要廣播地址,一般是0。

  1. // MODBUS的設(shè)備(從機)地址。 默認為254, 但由于本設(shè)備不支持254的地址,所以需要修改設(shè)備的地址為1.
  2. private final static int SLAVE_ADDRESS = 1;
  3. // 廣播地址
  4. private final static int broadcast_SLAVE_ADDRESS = 0;

下面貼一段經(jīng)典的,串口程序,第一段是打開串口,第二段是往串口發(fā)送數(shù)據(jù)的

  1. public static final SerialPort openPort(String portName, int baudrate) throws PortInUseException {
  2. try {
  3. // 通過端口名識別端口
  4. CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
  5. // 打開端口,并給端口名字和一個timeout(打開操作的超時時間)
  6. CommPort commPort = portIdentifier.open(portName, 2000);
  7. // 判斷是不是串口
  8. if (commPort instanceof SerialPort) {
  9. SerialPort serialPort = (SerialPort) commPort;
  10. try {
  11. // 設(shè)置一下串口的波特率等參數(shù)
  12. // 數(shù)據(jù)位:8
  13. // 停止位:1
  14. // 校驗位:None
  15. serialPort.setSerialPortParams(baudrate, SerialPortManager.DATABITS_8, SerialPortManager.STOPBITS_1,
  16. SerialPortManager.PARITY_NONE);
  17. } catch (UnsupportedCommOperationException e) {
  18. e.printStackTrace();
  19. }
  20. return serialPort;
  21. }
  22. } catch (NoSuchPortException e1) {
  23. e1.printStackTrace();
  24. }
  25. return null;
  26. }

入?yún)⑹谴诿Q和波特率。返回值是實體對象。

  1. public static void sendToPort(SerialPort serialPort, byte[] order) {
  2. OutputStream out = null;
  3. try {
  4. out = serialPort.getOutputStream();
  5. out.write(order);
  6. out.flush();
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. } finally {
  10. try {
  11. if (out != null) {
  12. out.close();
  13. out = null;
  14. }
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }

入?yún)⑹谴趯ο髮嶓w,即第一段打開串口代碼的返回值。用的是outPutStream,輸出流。

而modbus rtu是怎么實現(xiàn)串口打開和發(fā)送呢,起始modbus只是基于串口,本質(zhì)上還是主從機之間的通訊。

  1. // 實例化ModBus工廠
  2. ModbusFactory modbusFactory = new ModbusFactory();
  3. ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);

跟SerialPort實體類似,ModbusMaster是個主機對象,當你將其init()的時候,在modbus角度你開啟了主機,其實就是打開了串口。

modbus的發(fā)送不用贅述,基本就是遵循modbus的格式,功能碼、寄存器地址、寄存器數(shù)量、數(shù)據(jù)位等等。例如16功能碼,代表寫入多個連續(xù)保持寄存器,支持廣播模式。

這是16碼的格式:

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多