一、概述
Model3C芯片是一款基于RISC-V的高性能、國產自主、工業級高清顯示與智能控制MCU,配備強大的2D圖形加速處理器、PNG/JPEG解碼引擎,并支持工業寬溫。基于Model3C芯片的86彩屏中控面板,通過集成Modbus協議,實現了與多種控制設備的通信和數據交換。
二、Modbus協議簡介
Modbus協議是應用于電子控制器上的一種通用語言。通過此協議,控制器相互之間、控制器經由網絡(例如以太網)和其他設備之間可以通信。它已經成為一通用工業標準,使得不同廠商生產的控制設備可以連成工業網絡,進行集中監控。
此協議定義了一個控制器能認識使用的消息結構,而不管它們是經過何種網絡進行通信的。它描述了一控制器請求訪問其它設備的過程,如何回應來自其它設備的請求,以及怎樣偵測錯誤并記錄。它制定了消息域格局和內容的公共格式。當在一Modbus網絡上通信時,此協議決定了每個控制器須要知道它們的設備地址,識別按地址發來的消息,決定要產生何種行動。如果需要回應,控制器將生成反饋信息并用Modbus 協議發出。在其它網絡上,包含了 Modbus 協議的消息轉換為在此網絡上使用的幀或包結構。這種轉換也擴展了根據具體的網絡解決節地址、路由路徑及錯誤檢測的方法。
三、Modbus RTU在Model3C芯片方案中的應用
通信接口:Model3C芯片方案支持RS-485接口,該接口是Modbus RTU常用的串行通信接口之一。通過RS-485接口,86彩屏中控面板可以與其他Modbus設備(如PLC、傳感器等)進行通信。
通信參數:在Model3C芯片方案中,Modbus RTU通信采用異步通訊模式,具體參數包括1位起始位、8位數據位、1位停止位、無校驗位,波特率可根據實際需求進行配置(如常用的9600波特率)。
報文格式:Modbus RTU報文包括設備地址、功能碼、數據域和CRC校驗碼等部分。在Model3C芯片方案中,這些報文格式遵循Modbus協議規范,確保通信的準確性和可靠性。
主從通信:在Modbus RTU通信中,Model3C芯片方案的86彩屏中控面板可以作為主設備(Master)或從設備(Slave)進行通信。作為主設備時,它可以主動發起查詢請求;作為從設備時,它可以響應主設備的查詢請求并提供相關數據。
功能碼:Modbus協議定義了多種功能碼(如讀取線圈狀態、寫入線圈狀態、讀取保持寄存器等),用于實現不同的通信功能。
在Model3C芯片方案中,這些功能碼得到了全面支持,使得86彩屏中控面板可以實現與多種Modbus設備的靈活通信和數據交換。
四、rt-thread 使用libmodbus-rtu庫
libmodbus是一個與使用Modbus協議的設備進行數據發送/接收的庫。該庫包含各種后端通過不同網絡進行通信(例如,RTU模式下的串口或TCP / IPv6中的以太網)。
將libmodbus庫從軟件包里啟用, libmodbus是基于select操作的,依賴于文件系統和libc,需要在rt-thread中開啟對應的支持。
RS485的話需要指定 modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS232); //改為485
modbus_rtu_set_rts(ctx, RS485_RE, MODBUS_RTU_RTS_UP); //指定485控制引腳和電平
#include “modbus_rtu_test.h” #include “modbus.h” #include “stdio.h” #include “string.h” #include #include /* 使用BSD socket,需要包含socket.h頭文件 */ #include #include #include #define RS485_RE GET_PIN(G, 8) static void test_thread(void *param) { int slaveaddrs = 3; uint16_t tab_reg[64] = {0}; modbus_t *ctx = RT_NULL; ctx = modbus_new_rtu("/dev/uart2", 9600, ‘N’, 8, 1); modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS232); //modbus_rtu_set_rts(ctx, RS485_RE, MODBUS_RTU_RTS_UP); modbus_set_slave(ctx, slaveaddrs); modbus_connect(ctx); modbus_set_response_timeout(ctx, 0, 200000); //50ms int num = 0; while (1) { memset(tab_reg, 0, 64 * 2); int regs = modbus_read_registers(ctx, 0, 20, tab_reg); if (regs == -1) { rt_kprintf(“error addrs %d—\n”, slaveaddrs); if(slaveaddrs == 2) { slaveaddrs = 3; } else { slaveaddrs = 2; } modbus_set_slave(ctx, slaveaddrs); } else { rt_kprintf("-->addrs %d", slaveaddrs); rt_kprintf("[%4d][read num = %d]", num, regs); num++; int i; for (i = 0; i < 20; i++) { rt_kprintf("<%#x>", tab_reg[i]); } rt_kprintf("\n"); if(slaveaddrs == 2) { slaveaddrs = 3; } else { slaveaddrs = 2; } modbus_set_slave(ctx, slaveaddrs); } rt_thread_mdelay(500); } //7-關閉modbus端口 modbus_close(ctx); //8-釋放modbus資源 modbus_free(ctx); } static void rtu77(int argc, char **argv) { //rt_pin_mode(RS485_RE, PIN_MODE_OUTPUT); rt_thread_t tid; tid = rt_thread_create(“test”, test_thread, RT_NULL, 2048, 12, 10); if (tid != RT_NULL) rt_thread_startup(tid); return RT_EOK; } MSH_CMD_EXPORT(rtu77, a rtu test);
五、Modbus RTU布線
Modbus RTU使用串行通信,通常使用RS-232或RS-485接口。
RS-232:這是一種點對點的通信方式,每個設備都需要單獨的串行線連接到主控器。它使用9針或25針的D-sub連接器,但通常只用到其中的少數幾個引腳,如TX(發送)、RX(接收)、GND(地線)。
RS-485:這是一種多點通信方式,允許多個設備共享同一對雙絞線。RS-485使用一對雙絞線(通常標記為A和B),并使用終端電阻來匹配線路。每個設備都有一個數據發送器(TX)和數據接收器(RX)引腳,以及一個公共地線(GND)。
六、Modbus RTU特點
以RS-485或RS-232作為其物理層實現。它使用總線式拓撲結構,允許多個設備共享同一通信線路,實現成本效益和簡單的布線需求。Modbus RTU的數據傳輸采用二進制編碼,每個數據幀包含地址碼、功能碼、數據和校驗碼,通過CRC校驗確保數據的準確性。這種協議特別適合于短距離通信和成本敏感的應用場景。
七、總結
基于Model3C芯片的86彩屏中控面板通過集成Modbus RTU協議,實現了與多種控制設備的通信和數據交換。其高性能的通信接口和豐富的通信功能使得該中控面板在工業控制、智能建筑等領域具有廣泛的應用前景。
Model系列芯片芯片基于RT-Thread進行開發,而RT-Thread可以通過集成第三方庫來支持Modbus RTU,因此Model系列芯片完全可以支持Modbus RTU協議
-
芯片
+關注
關注
456文章
51192瀏覽量
427326 -
MODBUS
+關注
關注
28文章
1821瀏覽量
77320 -
HMI
+關注
關注
9文章
597瀏覽量
48737
發布評論請先 登錄
相關推薦
評論