久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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)準的通訊協(xié)議,一般用于不同廠商設(shè)備之間進行數(shù)據(jù)交換,,是應(yīng)用層的軟件協(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)絡(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)準串口通訊,是有自己的標(biāo)準通信格式的,。

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

上圖是modbus rtu的通訊規(guī)約,接下里的任務(wù),,是搞懂485通訊規(guī)約和modbus rtu通訊規(guī)約的區(qū)別,,兩種格式到底區(qū)別在哪里。為什么供應(yīng)商選擇用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)于電平、電壓的約定,。搞軟件的不一定看得懂,,特別是應(yīng)用層軟件。

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

但是我弄清楚了什么叫所謂的RS485通訊協(xié)議,是硬件的,、關(guān)于電平,、電壓的,一個規(guī)約,,跟應(yīng)用軟件沒半毛錢關(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是個主機對象,,當(dāng)你將其init()的時候,,在modbus角度你開啟了主機,其實就是打開了串口,。

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

這是16碼的格式:

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多