# OPU_UA_To_Modbus_RTU **Repository Path**: hudiekaxp/opc_ua_to_modbus_rtu ## Basic Information - **Project Name**: OPU_UA_To_Modbus_RTU - **Description**: 基于NXP i.MX RT1060设计的OPC UA到Modbus RTU的网关 - **Primary Language**: C - **License**: BSD-3-Clause-Clear - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 3 - **Created**: 2022-08-09 - **Last Updated**: 2024-05-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README OPC UA 网关升级 两年前写过一篇《[OPCUA Server & Modbus Master Converter by I.MX RT106x](https://mp.weixin.qq.com/s/ZluriHaEVz2NOb4Oi87eXA)》的文章,其实是按照adfweb公司的HD67B27模块功能做的,应用场景如下: ![image-20220808134801579](https://kala4tgo-wechat.oss-cn-zhangjiakou.aliyuncs.com/pic/image-20220808134801579.png) 为了降低工作量,将其上位机配置软件的功能改为通过修改json脚本来进行配置: ![image-20220808141230355](https://kala4tgo-wechat.oss-cn-zhangjiakou.aliyuncs.com/pic/image-20220808141230355.png) ![image-20220808135346341](https://kala4tgo-wechat.oss-cn-zhangjiakou.aliyuncs.com/pic/image-20220808135346341.png) 等效于下面的示例配置(注意NTP目前尚未实现),实际使用的时候只要将下面代码保存为GW_cfg.json文件,并拷贝到TF卡上插入RT1060-EVK开发板即可: ```json { "Communication": { "OPC_UA_Server": { "IP_Address": "192.168.1.102", "SubNet_Mask": "255.255.255.0", "Gateway": "192.168.1.1", "DNS": "192.168.1.1", "PORT": "4840" }, "Modbus_Master": { "Serial": "RS232", "Baudrate": "115200", "Parity": "NONE", "Stop_Bits": "1", "TimeOut": "1000", "DataBitsCount": "8" }, "NTP": { "Server_URL": "ntp.pool.org", "Poll_Time": "1000" } }, "OPC_UA_Access": { "OPC_UA_Table": [{ "Type": "UInt16", "Position": "0", "Length": "2", "Name": "Temperature", "R_W": "0" }, { "Type": "UInt16", "Position": "8", "Length": "2", "Name": "Voltage", "R_W": "1" } ] }, "Modbus_Read_Access": { "Read_Table": [{ "Slave_ID": "51", "FunctionCode": "3", "Address": "0", "NPoint": "2", "Poll_Time": "1000", "Max_Error": "0", "Position": "0", "StartBit": "1", "Swap": "0", "SwapWord": "0" }, { "Slave_ID": "51", "FunctionCode": "3", "Address": "1", "NPoint": "2", "Poll_Time": "1000", "Max_Error": "0", "Position": "4", "StartBit": "0", "Swap": "0", "SwapWord": "0" } ] }, "Modbus_Write_Access": { "Write_Table": [{ "Slave_ID": "51", "FunctionCode": "6", "Address": "2", "NPoint": "1", "Poll_Time": "0", "OnChange": "1", "OnCMD": "0", "Max_Error": "0", "Position": "8", "StartBit": "0", "Swap": "0", "SwapWord": "0" }, { "Slave_ID": "51", "FunctionCode": "6", "Address": "3", "NPoint": "1", "Poll_Time": "0", "OnChange": "1", "OnCMD": "0", "Max_Error": "0", "Position": "12", "StartBit": "0", "Swap": "0", "SwapWord": "0" } ] } } ``` 当初做的时候有以下两个问题: 1. Flexspi的Flash IAP有时会卡死,导致修改参数失败 2. 不支持UART DMA数据发送/接收 3. UART不支持数据位的设置(虽然RTU不需要支持7bit) 最近有时间升级了下代码,将Flexspi的操作修改为ROM API,增加IAP的可靠性,增加了7bit的UART的支持,并添加了UART的DMA支持(包括TX/RX),通过使能RT1060特有的RX IDLE中断功能,可以大大降低Core的负荷,可以释放出更多的算力给用于其他功能。该RT1060平台对比同类传统基于处理器+Linux 的IoT模块,启动时间以及性价比有较大的优势。 下一步打算把之前跟大家介绍的MQTT stack也移植进来,敬请期待。 代码下载链接: