乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      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是一種國際標(biāo)準(zhǔn)的通訊協(xié)議,一般用于不同廠商設(shè)備之間進(jìn)行數(shù)據(jù)交換,是應(yīng)用層的軟件協(xié)議,不能自己單獨存在,必須要依賴于硬件設(shè)備作為實現(xiàn)平臺。不同的硬件具有不同的電氣特性和連接方式,比如RS232、RS485。可以把Modbus比作英語,RS232比作印度人,RS485比作美國人,印度人之間講英語時,理解為基于RS232的modbus通信,美國人之間講英語時,理解為基于RS485的modbus通信。

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

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

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

      協(xié)議分為硬件協(xié)議和軟件協(xié)議。而通訊協(xié)議屬于軟件協(xié)議,它包含報頭包圍的格式,MODBUS是應(yīng)用層的通訊協(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)在在面對實際問題,以下是供應(yīng)商給出來的一句話:

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

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

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

      補(bǔ)充1:

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

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

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

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

      補(bǔ)充2(2020.12.14):

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

      串口通訊和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需要從機(jī)地址(設(shè)備地址),如果是廣播模式就需要廣播地址,一般是0。

      1. // MODBUS的設(shè)備(從機(jī))地址。 默認(rèn)為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ì)上還是主從機(jī)之間的通訊。

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

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

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

      這是16碼的格式:

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多