新闻动态

你的位置:九游会(中国区)集团官方网站 > 新闻动态 > 自创建以来漠视:由于 DTU01 是 Tcp Server -九游会(中国区)集团官方网站

自创建以来漠视:由于 DTU01 是 Tcp Server -九游会(中国区)集团官方网站

发布日期:2024-04-05 06:24    点击次数:138

DIY一个以太网转RS485 Modbus网关

1 竣事功能

基于 FlexLua DTU01全能网络器竣事 以太网 通讯和 RS485 通讯之间的数据透传,以太网接入管事器的神志为 Tcp Server。

在 以太网 通讯链路上,DTU01 和 远端管事器通讯数据局势为 HEX 字节流在 485 通讯链路上,DTU01 和 RS485 节点通讯数据局势为 HEX 字节流

下行通说念例如:例如当远端的 TCP 管事器向 DTU 发送 0x08 0x09 0x0A,则 DTU 在收到这些数据后会保残守缺通过 485总线 将 0x08 0x09 0x0A 转发给RS485 节点。

上行通说念例如:例如当 RS485 节点向 DTU 发送 0x01 0x02 0x03,则 DTU 在收到这些数据后会保残守缺通过 以太网 将 0x01 0x02 0x03 转发给远端的管事器。

漠视:由于 DTU01 是 Tcp Server ,远端管事器是 Tcp Client,是以总共系统不合适双向就地透传数据。漠视由远端管事器发起数据传输,进而恭候RS485节点回答支吾数据。

2 竣事步履

(1)硬件

由于 DTU01 的硬件接口是可建树的,是以需要阐明一下您手上的 DTU01 网络器是否满足条目,若是阐明已满足就无需再作念任何操作,否则请按《DTU01硬件使用劝诱书》完成底下的硬件建树:

DTU01 电路板上的 ‘A’ 和 ‘B’ 引脚需建树成 485 接口的 ‘A’ 和 ‘B’,即 S3 聘用DTU01 电路板正面焊合上 SB-C18 以太网通讯模块DTU01 电路板上的 ‘+’ 和 ‘-’ 电源输出引脚建树成 12v 输出用来接12v的传感器/姿色/拓荒(非必须)

《DTU01硬件使用劝诱书》可在 {FlexLua开源网盘}->{Hardware}->{DTU01全能网络器}->{DTU01硬件使用劝诱书} 文献夹中找到。

(2)软件

只需将本著述末尾提供的源码拷贝消散至拓荒上的 main.lua 文献中,并把柄本色情况修改源码起原部分的建树信息,即可竣事大部分场景的需求。

操作步履:领先用TypeC USB数据线将拓荒和电脑一语气,然后在电脑上会自动出现一个1.6MB大小的U盘(若是U盘大小是0MB,则需用FAT32快速局势化该盘),找到 main.lua 代码文献(若是莫得请自行创建一个 main.lua文献),然后将本文的源码拷贝消散至 main.lua 文献中然后Ctrl+S保存即可,代码更新后不才次重新上电后其会自行编译并运行。

3 源代码

底下贴出完好的源代码,关联词可能在网页上展示局势相比衰退词语,看源代码的话不错在 FlexLua 官网的 C004A 文档中找到源码。

----------------------建树信息出手--------------------------Part1: 以太网参数建树:TCP Server 静态IP示例(本机IP=192.168.0.35,本机端标语=40001)ROLE = {0x00} --0x00:TCP Server, 0x01:TCP Client, 0x02:UDP Server, 0x03:UDP ClientSRCPORT = {0x41,0x9c} --源端标语,例如40001=0x9c41DHCP = {0x00} --0x00关闭DHCP, 0x01使能DHCPSRCIP = {192,168,0,35} --源IP地址GATEWAY = {192,168,0,1}--网关地址SUBNET = {255,255,255,0} --子网掩码DESPORT = {0,0} --打算端标语,无需建树DESIP = {0,0,0,0} --打算IP地址,无需建树--Part2:RS485 通讯建树Rs485BaudRate = "BAUDRATE_9600" --串口校验成立Rs485ParitySet = "NoneParity" --"NoneParity","EvenParity","OddParity"--串口罢手位成立Rs485StopBitSet = "StopBit_1" --"StopBit_1","StopBit_1_5","StopBit_2"----------------------建树信息终端--------------------------外围拓荒GPIO分拨CH9121_RSTI = "D6"CH9121_CFG = "D5" --DTU01电路板莫得一语气CFG引脚,是以不可用CFG引脚神志建树以太网模块,必须要用协商神志(该神志需要提前用Wch厂家提供的上位机开启)-------------------全局变量(可变值)-------------------RedLedTimeMsCnt = 0GreenLedTimeMsCnt = 0EthLostContactTimeMsCnt = 0 --以太网故障计时器--CH9121以太网模块写敕令和数据function Ch9121Write(cmd, data) LIB_GpioToggle("D11") --喂硬件看门狗 SendData = {0x57,0xab} SendData[#SendData+1] = cmd for i=1,#data do SendData[#SendData+1] = data[i] end --发送数据包 LIB_Uart0Send(SendData) LIB_DelayMs(100)--延时不可低于100ms,否则会有个别领导收不到回答 --查询Uart0是否收到0xaa支吾 u0_flag,u0_tab = LIB_Uart0Recv() if u0_flag == 1 and u0_tab[1] == 0xaa then print(string.format("Ch9121 0xx wr ok, Send=",cmd)..LIB_HexTabToHexStr(SendData).."\r\n") else print(string.format("Ch9121 0xx wr fail, Send=",cmd)..LIB_HexTabToHexStr(SendData).."\r\n") endend--CH9121以太网模块读敕令和数据function Ch9121Read(cmd) LIB_GpioToggle("D11") --喂硬件看门狗 SendData = {0x57,0xab} SendData[#SendData+1] = cmd --发送数据包 LIB_Uart0Send(SendData) LIB_DelayMs(100)--延时不可低于100ms,否则会有个别领导收不到回答 --查询Uart0是否收到支吾 u0_flag,u0_tab = LIB_Uart0Recv() if u0_flag == 1 then print(string.format("Ch9121 0xx rd ok, Recv=",cmd)..LIB_HexTabToHexStr(u0_tab).."\r\n") else print(string.format("Ch9121 0xx rd fail, Send=",cmd)..LIB_HexTabToHexStr(SendData).."\r\n") endend--CH9121开动化function Ch9121Init() LIB_GpioOutputConfig(CH9121_RSTI,"STANDARD") LIB_GpioOutputConfig(CH9121_CFG,"STANDARD") --CH9121复位 LIB_GpioWrite(CH9121_RSTI,0) LIB_DelayMs(100) LIB_GpioWrite(CH9121_RSTI,1) LIB_DelayMs(200)--这里需要延时 LIB_GpioToggle("D11") --喂硬件看门狗 --CH9121插足建树款式(CFG引脚神志) LIB_GpioWrite(CH9121_CFG,0)--DTU01没接CFG,此种建树神志无效! LIB_DelayMs(100) --CH9121插足建树款式(串口协商神志) LIB_DelayMs(500) SendData = {0x55,0xaa,0x5a} LIB_Uart0Send(SendData)--发送 55 aa 5a cnt = 0 while cnt < 500 do --500ms内恭候ch9121回答a5 LIB_DelayMs(1) LIB_GpioToggle("D11") --喂硬件看门狗 cnt = cnt + 1 u0_flag,u0_tab = LIB_Uart0Recv() if u0_flag == 1 and u0_tab[1] == 0xa5 then break end end if cnt >= 500 then print("Ch9121 init fail, system reset!") LIB_GpioWrite("D3",0) --蓝灯亮3秒后重启 LIB_GpioToggle("D11") --喂硬件看门狗 LIB_DelayMs(3000) LIB_SystemReset() end SendData = {0xa5} LIB_Uart0Send(SendData)--发送 a5 cnt = 0 while cnt < 500 do --500ms内恭候ch9121回答a5 LIB_DelayMs(1) LIB_GpioToggle("D11") --喂硬件看门狗 cnt = cnt + 1 u0_flag,u0_tab = LIB_Uart0Recv() if u0_flag == 1 and u0_tab[1] == 0xa5 then break end end if cnt >= 500 then print("Ch9121 init fail, system reset!") LIB_GpioWrite("D3",0) --蓝灯亮3秒后重启 LIB_GpioToggle("D11") --喂硬件看门狗 LIB_DelayMs(3000) LIB_SystemReset() end LIB_DelayMs(20) --读取芯片MAC地址 mac_ok,mac = Ch9121Read(0x81) if mac_ok == 1 and #mac == 6 then print("Mac:"..LIB_HexTabToHexStr(mac)) end Ch9121Write(0x10,ROLE) --0x00:TCP Server, 0x01:TCP Client, 0x02:UDP Server, 0x03:UDP Client --建树网罗信息(打算IP和端标语建树),仅当Client时灵验 if ROLE[1] == 0x01 or ROLE[1] == 0x03then Ch9121Write(0x15,DESIP)--打算IP Ch9121Write(0x16,DESPORT)--打算端标语 end --建树网罗信息(静态IP建树) if DHCP[1] ~= 0x01 then Ch9121Write(0x11,SRCIP)--源IP Ch9121Write(0x12,SUBNET)--子网掩码 Ch9121Write(0x13,GATEWAY) --网关 end Ch9121Write(0x14,SRCPORT)--土产货源端口PORT Ch9121Write(0x23,{0x01,0x00,0x00,0x00})--RX采选打包超无为间1*5ms Ch9121Write(0x24,{0x00})--网线断开握住网 Ch9121Write(0x25,{0x00,0x02,0x00,0x00})--RX采选打包数据个数512字节 Ch9121Write(0x26,{0x01})--网罗一语气时清空串口数据 Ch9121Write(0x33,DHCP)--DHCP or Static Ch9121Write(0x0d,{})--更新建树参数至EEPROM Ch9121Write(0x0e,{})--践诺建树,复位CH9121 LIB_GpioToggle("D11") --喂硬件看门狗 LIB_DelayMs(200) --CH9121退出建树款式 LIB_GpioWrite(CH9121_CFG,1)--DTU01没接CFG,此种建树神志无效! --CH9121退出建树款式(串口协商神志) Ch9121Write(0x5e,{}) LIB_DelayMs(50) end--该函数用来判断以太网模块是不是很久充公到音问了,有可能是以太网模块故障了--若是是故障就重启践诺以太网模块的开动化经过function EthKeepAlive() --超过30分钟莫得以太网通讯看成,以为以太网模块出问题 if EthLostContactTimeMsCnt >= 1800000 then LIB_SystemReset() --重启总共系统 endend--界说10毫秒定时器的回调函数,函数名字必须是LIB_10msTimerCallbackfunction LIB_10msTimerCallback() EthLostContactTimeMsCnt = EthLostContactTimeMsCnt + 10 LIB_GpioToggle("D11") --喂硬件看门狗 --绿色LED灯精明措置要领 if GreenLedTimeMsCnt >= 10 then GreenLedTimeMsCnt = GreenLedTimeMsCnt - 10 LIB_GpioWrite("D1",0) --绿灯亮 else LIB_GpioWrite("D1",1) --绿灯灭 end --红色LED灯精明措置要领 if RedLedTimeMsCnt > 10 then RedLedTimeMsCnt = RedLedTimeMsCnt - 10 LIB_GpioWrite("D0",0) --红灯亮 else LIB_GpioWrite("D0",1) --红灯灭 endend--硬件开动化函数function Init() --使能系统日记,无须的时间关闭 --LIB_SystemLogEnable() --建树Uart0波特率为9600,和CH9121以太网模块通讯 LIB_Uart0Config("BAUDRATE_9600") --建树D0,D1,D3为普通GPIO输出,松手LED_R,LED_G,LED_B LIB_GpioOutputConfig("D0","STANDARD") LIB_GpioOutputConfig("D1","STANDARD") LIB_GpioOutputConfig("D3","STANDARD") LIB_GpioWrite("D0",1) --红灯灭 LIB_GpioWrite("D1",1) --绿灯灭 LIB_GpioWrite("D3",1) --蓝灯灭 --建树D11为普通输出,松手看门狗 LIB_GpioOutputConfig("D11","STANDARD") --开动化CH9121以太网模块 Ch9121Init() --建树Uart1串口使命,D8自动松手收发电平 LIB_Uart1Rs485Config(Rs485BaudRate,"D8",Rs485ParitySet,Rs485StopBitSet) --使能系统10毫秒定时器出手使命 LIB_10msTimerConfig("ENABLE")end--硬件开动化Init()--出手大轮回while(GC(1) == true)do --查询是否收到以太网数据,例如:0x01 0x02 0x03 u0_flag,u0_tab = LIB_Uart0Recv() if u0_flag == 1 then --绿灯闪0.1秒 GreenLedTimeMsCnt = 100 --清零Eth故障判断计时器 EthLostContactTimeMsCnt = 0 --将收到的数据保残守缺转发给485端口 LIB_Uart1BlockSend(u0_tab) end --查询是否收到485数据,例如:0x01 0x02 0x03 flag,tab = LIB_Uart1Recv() if flag == 1 then --红灯闪0.1秒 RedLedTimeMsCnt = 100 --将收到的数据保残守缺转发予以太网 LIB_Uart0Send(tab) end --EthKeepAlive()用来进行判断以太网是否泛泛,也可接头去掉该函数,原因如下: --因为若是30分钟收不到以太网数据,该函数会让以太网模块重启,导致TCP断开一语气,Client端需要再次重新践诺TCP一语气 --但若是约略保证30分钟内势必会收到Client端发来的音问,则可保留此函数,因为这么可保证以太网长久使命的领悟性 --说七说八,为了保证长久使命的领悟性,Client端需要在检测到本Server端断连后,再次重新践诺TCP一语气 EthKeepAlive()end