日本电影一区二区_日本va欧美va精品发布_日本黄h兄妹h动漫一区二区三区_日本欧美黄色

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

一、RS485基礎(chǔ)通信例程實現(xiàn)的功能描述

開發(fā)板通過UART1接口 SP485EEN芯片實現(xiàn)和電腦端串口調(diào)試助手的通信。并實現(xiàn)如下兩個收發(fā)范例功能:
如果PC端通過485向開發(fā)板發(fā)送5字節(jié)數(shù)據(jù),且5字節(jié)數(shù)據(jù)為06 07 08 09 0A,則黃色LED1閃爍一次
開發(fā)板每隔1秒通過485向PC端發(fā)送5字節(jié)數(shù)據(jù),01 02 03 04 05

二、本實驗教學(xué)目的

掌握基于ShineBlink的:
UART通信(占用RX1,TX1)
GPIO控制485轉(zhuǎn)換芯片的方向(D2引腳控制485芯片的方向,高電平)
-GPIO控制LED1亮滅(D8連接黃色LED1)

三、本實驗涉及的模塊
485接口在開發(fā)板上的位置如下:

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

注意,為了使用485接口,必須將P7和P8跳線帽短接才能讓TX1引腳、RX1引腳和485轉(zhuǎn)換芯片連接。

四、完整源代碼
以下代碼實現(xiàn)了如下功能:
如果PC端通過485向開發(fā)板發(fā)送5字節(jié)數(shù)據(jù),且5字節(jié)數(shù)據(jù)為06 07 08 09 0A,則黃色LED1閃爍一次
開發(fā)板每隔1秒通過485向PC端發(fā)送5字節(jié)數(shù)據(jù),01 02 03 04 05

  1. LIB_GpioOutputConfig("D8","STANDARD") –初始化GPIO控制黃色LED1
  2. LIB_GpioOutputConfig("D2","STANDARD") –初始化GPIO控制Max485 RE DE 收發(fā)控制
  3. –配置Uart1串口波特率為19200,用作485通訊
  4. LIB_Uart1Config("BAUDRATE_19200")
  5. –使能MAX485發(fā)送
  6. function SendEn()
  7. LIB_GpioWrite("D2",1)
  8. end
  9. –使能MAX485接收
  10. function recvEn()
  11. LIB_GpioWrite("D2",0)
  12. end
  13. –使能10毫秒定時器開始工作
  14. LIB_10msTimerConfig("ENABLE")
  15. cnt_10ms = 0
  16. –定義10毫秒定時器的中斷函數(shù)
  17. function LIB_10msTimerCallback()
  18. cnt_10ms = cnt_10ms 1
  19. end
  20. –開始大循環(huán)
  21. while(GC(1) == true)
  22. do
  23. –每1秒發(fā)送5字節(jié)數(shù)據(jù)給PC端
  24. if cnt_10ms >= 100 then –1000ms
  25. cnt_10ms = 0
  26. send_data = {1,2,3,4,5}
  27. SendEn()
  28. LIB_Uart1BlockSend(send_data)
  29. RecvEn()
  30. end
  31. –查詢是否收到PC端發(fā)來的5字節(jié)數(shù)據(jù),并驗證
  32. recv_flag,recv_data = LIB_Uart1Recv()
  33. if recv_flag == 1 and #recv_data == 5 then
  34. if recv_data[1] == 6 and recv_data[2] == 7 and recv_data[3] == 8 and recv_data[4] == 9 and recv_data[5] == 10 then
  35. LIB_GpioToggle("D8") –切換LED狀態(tài)
  36. end
  37. end
  38. end

復(fù)制代碼

五、實驗現(xiàn)象

將開發(fā)板的485接口通過485轉(zhuǎn)USB工具和PC端連接以后,將上面的代碼復(fù)制到開發(fā)板的虛擬TF卡中并開始運行,之后每秒鐘可以在PC端串口調(diào)試助手收到開發(fā)板發(fā)來的5字節(jié)數(shù)據(jù)(01 02 03 04 05),并且當(dāng)調(diào)試助手向開發(fā)板下發(fā)(06 07 08 09 0a)以后,開發(fā)板的黃色LED燈會閃爍以下,如下圖:

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

注意:軟件需要勾選“HEX顯示”和"HEX發(fā)送"。設(shè)備和上位機(jī)(Modbus主機(jī))通信的實現(xiàn)簡介:下文介紹了如何用ShineBlink作為設(shè)備端(Modbus從機(jī))來和上位機(jī)(Modbus主機(jī))來通信,并在ShineBlink設(shè)備端實現(xiàn)了0x03功能碼(讀取多個保持寄存器)和0x05功能碼(寫單個線圈)的程序代碼。一、實現(xiàn)環(huán)境設(shè)備作為Modbus從機(jī)通過RS485總線上位機(jī)通信,我們在電腦上運行知名的Modbus Poll調(diào)試軟件作為上位機(jī)來模擬Modbus主機(jī),Modbus Poll軟件可以到其官網(wǎng)上下載。二、設(shè)備介紹設(shè)備作為Modbus網(wǎng)絡(luò)中的其中一個節(jié)點有如下特性:串口屬性:19200、N、8、1設(shè)備地址:21(0x15)設(shè)備支持的Modbus功能碼:0x05 寫單個線圈0x03 讀取多個保持寄存器功能介紹:0x05,上位機(jī)通過向設(shè)備發(fā)送0x05功能碼,對線圈地址為0x0000的線圈寫入值0xFF00時,設(shè)備開始運行,對線圈地址為0x0000的線圈寫入值0x0000時,設(shè)備停止運行。0x03,上位機(jī)通過向設(shè)備發(fā)送0x03功能碼,讀取保持寄存器起始地址為0x0000的9個保持寄存器(每個保持寄存器值為16bit無符號數(shù)據(jù)),每個寄存器對應(yīng)的數(shù)據(jù)如下:

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

三、Modbus通信實現(xiàn)代碼實例

以下代碼不僅實現(xiàn)了03和05功能碼,并實現(xiàn)了將各種異常情況回復(fù)給Modbus主機(jī)。

  1. –程序中用到的全局變量定義
  2. Pm25Percent = 0
  3. HchoPercent = 0
  4. TvocPercent = 0
  5. MeshPercent = 0.0
  6. Temprature1 = 0.00
  7. Temprature2 = 0.00
  8. Wind485DisSpeed = 0
  9. DevIsRunning = 0 –控制設(shè)備運行或停止
  10. FaultCode = 0 –故障代碼
  11. –ModBus通信函數(shù)定義
  12. function ModbusProcess()
  13. local sdata = {}
  14. –查詢是否收到Modbus主機(jī)發(fā)來的消息
  15. flag, data = LIB_Uart1Recv()
  16. if flag == 1 then
  17. –判斷消息是不是發(fā)給本機(jī),是本機(jī)的才理會
  18. if data[1] == PI[2] then –PI[2], Modbus本機(jī)地址(1-247)
  19. –判斷Modbus功能碼
  20. if data[2] == 0x05 then — 0x05 寫單個線圈
  21. –這里定義線圈地址為0x0000的線圈為開機(jī)/關(guān)機(jī)控制信號
  22. if data[3] == 0x00 and data[4] == 0x00 then
  23. if data[5] == 0xff and data[6] == 0x00 then –ON
  24. DevIsRunning = 1 –置1開機(jī)全局變量
  25. elseif data[5] == 0x00 and data[6] == 0x00 then –OFF
  26. DevIsRunning = 0 –置0開機(jī)全局變量
  27. else
  28. –這里需回復(fù)非法數(shù)據(jù)03異常消息(非法數(shù)據(jù)值),讀者可自行完成
  29. end
  30. –回復(fù)OK,把收到的數(shù)據(jù)原封不動回傳
  31. LIB_GpioWrite("D2",1) –使能485模塊發(fā)送
  32. LIB_Uart1BlockSend(data)
  33. LIB_GpioWrite("D2",0) –使能485模塊接收
  34. else
  35. –回復(fù)異常消息(非法數(shù)據(jù)地址)
  36. sdata[1] = data[1] –本機(jī)地址
  37. sdata[2] = data[2] 0x80 –異常的時候功能碼加0x80
  38. sdata[3] = 0x02 –異常碼0x02表示設(shè)備不支持此數(shù)據(jù)地址
  39. CRC = LIB_CrcCalculate("CRC16_MODBUS", sdata)
  40. sdata[4] = CRC & 0x00ff –低位在前
  41. sdata[5] = CRC >> 8 –高位在后
  42. LIB_GpioWrite("D2",1) –使能485模塊發(fā)送
  43. LIB_Uart1BlockSend(sdata)
  44. LIB_GpioWrite("D2",0) –使能485模塊接收
  45. end
  46. –這里用0x03而不用0x04是因為很多主機(jī)只支持03 06 16指令,所以就隨大流咯
  47. elseif data[2] == 0x03 then –0x03 讀多個保持寄存器
  48. –這里定義起始地址為0x0000的這些寄存器存放傳感器數(shù)據(jù),且讀取的寄存器個數(shù)必須是9個
  49. if data[3] == 0x00 and data[4] == 0x00 and data[5] == 0x00 and data[6] == 0x09 then
  50. sdata[1] = data[1] –本機(jī)地址
  51. sdata[2] = data[2] –功能碼
  52. sdata[3] = 18 –數(shù)據(jù)域字節(jié)數(shù): 9個寄存器一共18字節(jié)
  53. sdata[4] = Pm25Percent >> 8
  54. sdata[5] = Pm25Percent & 0x00ff
  55. sdata[6] = HchoPercent >> 8
  56. sdata[7] = HchoPercent & 0x00ff
  57. sdata[8] = TvocPercent >> 8
  58. sdata[9] = TvocPercent & 0x00ff
  59. sdata[10] = math.floor(MeshPercent) >> 8
  60. sdata[11] = math.floor(MeshPercent) & 0x00ff
  61. sdata[12] = math.floor(Temprature1) >> 8
  62. sdata[13] = math.floor(Temprature1) & 0x00ff
  63. sdata[14] = math.floor(Temprature2) >> 8
  64. sdata[15] = math.floor(Temprature2) & 0x00ff
  65. sdata[16] = Wind485DisSpeed >> 8
  66. sdata[17] = Wind485DisSpeed & 0x00ff
  67. sdata[18] = DevIsRunning >> 8
  68. sdata[19] = DevIsRunning & 0x00ff
  69. sdata[20] = FaultCode >> 8
  70. sdata[21] = FaultCode & 0x00ff
  71. CRC = LIB_CrcCalculate("CRC16_MODBUS", sdata)
  72. sdata[22] = CRC & 0x00ff –低位在前
  73. sdata[23] = CRC >> 8 –高位在后
  74. –回復(fù)傳感器數(shù)據(jù)
  75. LIB_GpioWrite("D2",1) –使能485模塊發(fā)送
  76. LIB_Uart1BlockSend(sdata)
  77. LIB_GpioWrite("D2",0) –使能485模塊接收
  78. else
  79. –回復(fù)異常消息(非法數(shù)據(jù)地址)
  80. sdata[1] = data[1] –本機(jī)地址
  81. sdata[2] = data[2] 0x80 –異常的時候功能碼加0x80
  82. sdata[3] = 0x02 –異常碼0x02表示設(shè)備不支持此數(shù)據(jù)地址
  83. CRC = LIB_CrcCalculate("CRC16_MODBUS", sdata)
  84. sdata[4] = CRC & 0x00ff –低位在前
  85. sdata[5] = CRC >> 8 –高位在后
  86. LIB_GpioWrite("D2",1) –使能485模塊發(fā)送
  87. LIB_Uart1BlockSend(sdata)
  88. LIB_GpioWrite("D2",0) –使能485模塊接收
  89. end
  90. else
  91. –回復(fù)異常消息(非法功能碼)
  92. sdata[1] = data[1] –本機(jī)地址
  93. sdata[2] = data[2] 0x80 –異常的時候功能碼加0x80
  94. sdata[3] = 0x01 –異常碼0x01表示設(shè)備不支持此功能碼
  95. CRC = LIB_CrcCalculate("CRC16_MODBUS", sdata)
  96. sdata[4] = CRC & 0x00ff –低位在前
  97. sdata[5] = CRC >> 8 –高位在后
  98. LIB_GpioWrite("D2",1) –使能485模塊發(fā)送
  99. LIB_Uart1BlockSend(sdata)
  100. LIB_GpioWrite("D2",0) –使能485模塊接收
  101. end
  102. end
  103. end
  104. end
  105. ?
  106. –開始初始化ShineBlink
  107. –配置Uart1串口波特率為19200,接485模塊
  108. LIB_Uart1Config("BAUDRATE_19200")
  109. –485發(fā)送和接收控制引腳
  110. LIB_GpioOutputConfig("D2","STANDARD")
  111. LIB_GpioWrite("D2",0) –使能485模塊接收
  112. ?
  113. –開始大循環(huán)
  114. while(GC(1) == true)
  115. do
  116. –Modbus通信處理
  117. ModbusProcess()
  118. end

復(fù)制代碼

四、Modbus Poll 上位機(jī)實驗流程
(1)配置0x03讀取保持寄存器功能(Setup)

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

(2)建立Modbus串行通信連接(Connectiong)

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

(3)建立連接后的數(shù)據(jù)通信
1. 上位機(jī)每秒鐘自動下發(fā)0x03指令讀取設(shè)備的起始地址為0x0000的9個保持寄存器的值

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

通信數(shù)據(jù)日志:

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

上面設(shè)備回復(fù)的23個字節(jié)數(shù)據(jù)舉例說明:例如:15 03 12 00 06 00 00 00 01 00 00 00 16 00 16 00 00 00 00 00 00 D5 16數(shù)據(jù)結(jié)尾的CRC算法采用Modbus Crc16

  1. 本機(jī)地址:0x15
  2. 功能碼:0x03
  3. 字節(jié)數(shù):18字節(jié)(9個16bit無符號寄存器)
  4. 寄存器1:0x0006 表示pm25=6
  5. 寄存器2:0x0000 表示hch0=0
  6. 寄存器3:0x0001 表示tvoc=1
  7. 寄存器4:0x0000 表示mesh=6
  8. 寄存器5:0x0016 表示temprature1=21度
  9. 寄存器6:0x0016 表示temprature2=21度
  10. 寄存器7:0x0000 表示windspeed=0
  11. 寄存器8:0x0000 表示running=0
  12. 寄存器9:0x0000 表示faultcode=0
  13. CRC_L:0xD5
  14. CRC_H:0x16

復(fù)制代碼
2. 上位機(jī)下發(fā)開機(jī)命令(功能碼0x05,向線圈地址為0x0000處寫單個線圈值0xFF00)

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

通信數(shù)據(jù)日志:

低代碼物聯(lián)網(wǎng)開發(fā)板RS485串口及Modbus范例可接入機(jī)智云

3. 上位機(jī)下發(fā)停機(jī)命令(功能碼0x05, 向線圈地址為0x0000處寫單個線圈值0x0000)

上位機(jī)發(fā)送: 15 05 00 00 00 00 CE DE 設(shè)備應(yīng)回復(fù): 15 05 00 00 00 00 CE DE

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號
公眾號
在線咨詢
分享本頁
返回頂部
鸡西市| 乌审旗| 陆川县| 江门市| 磐安县| 泰州市| 两当县| 莎车县| 邛崃市| 柳江县| 横峰县| 若尔盖县| 兴业县| 伊吾县| 瑞安市| 乐都县| 拉萨市| 定远县| 邯郸县| 常宁市| 金门县| 集安市| 文安县| 宜宾市| 桐梓县| 京山县| 汶上县| 太和县| 安丘市| 铁岭市| 北辰区| 高要市| 漠河县| 铁岭市| 济源市| 谢通门县| 婺源县| 英超| 永平县| 遂宁市| 温泉县|