ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CODESYS Modbus TCP主站配置全攻略:从IP配置到数据映射的踩坑记录

CODESYS Modbus TCP主站配置全攻略:从IP配置到数据映射的踩坑记录 搞自动化项目的人大概都经历过这种时刻现场一堆仪表、变频器、HMI全都只支持Modbus TCP从站而你要把这些数据汇总到一套CODESYS软PLC里做统一逻辑。CODESYS做Modbus TCP主站的配置本身并不复杂但真动手做起来IP配置、设备添加、功能码选择、数据映射哪一步都可能跳出一个让你抓狂的坑。这篇文章就是我的完整踩坑记录从IP配置一路走到数据映射把关键参数和避坑细节一次说透。前阵子接手一个设备改造项目柜子里一台温控仪表、两台变频器、一个称重仪表全是Modbus TCP从站主控是一台装了CODESYS的工控机。原本以为照着官方文档配就行结果从下午干到天黑才把第一路数据稳定读进来。后面把配置过程翻来覆去捋了几遍发现坑都在细节里。今天把整个过程完整写出来包括设备选型、IP规划、主站参数、数据映射以及我实际调试时遇到的各种幺蛾子。这篇文章适合正在用CODESYS V3对接第三方Modbus TCP从站设备的工程师也适合刚接触软PLC、被官方文档绕晕的新手。1. 方案设计与环境准备1.1 为什么要让CODESYS当Modbus TCP主站先理清一个基础概念Modbus TCP是典型的请求—响应模型。主站主动发请求帧从站收到后应答。现场绝大多数设备——智能仪表、变频器、温控器、称重模块、大部分HMI——出厂都是按从站设计的它们不会主动往外推数据。当项目里需要把这些设备的数值、状态、设定值统一汇总到一套控制器里做联动逻辑时就必须有一个主站。用CODESYS做这个主站最大的优势有两个。第一是配置化你不需要像写51单片机主站程序那样自己组织MBAP头、PDU、功能码、地址校验那一大串字节CODESYS把整个协议栈封装成了设备对象填参数就行。第二是生态完整同一套IDE里既有逻辑编程又有总线配置Modbus TCP拿到的数据可以无缝进到IEC程序里参与运算不用搞中间转换层。还有一个很现实的原因现场从站设备可能来自不同厂家有的只开放Modbus TCP接口有的连文档都写得稀碎。用CODESYS做统一主站可以把这些设备的通讯差异消化在配置层上层逻辑不用关心数据是从哪台设备来的。这对后续维护也是好事换设备型号时改配置就行不用动PLC程序。1.2 软件版本与运行环境搭配CODESYS的项目坑很多不是功能本身的问题而是版本不匹配。这一节先说清楚你大概需要哪些东西。我这次使用的组合是组件版本/型号说明CODESYS Development SystemV3.5 SP17编程IDE版本影响设备库和界面CODESYS Control Win V3随IDE版本匹配安装软PLC运行时跑在Windows工控机上CODESYS Gateway V3随IDE安装IDE与运行时之间的通讯网关Modbus TCP设备描述内置或Store下载提供Modbus TCP Master设备对象从站设备温控仪表、变频器等支持Modbus TCP标准协议即可有几个容易踩的坑提前说。CODESYS Control Win V3的运行时版本和IDE版本必须匹配否则在扫描设备时能看到PLC但连接会报版本不一致。我见过有人IDE升到SP20Runtime还是SP17结果网关里刷出设备图标却连不上。另外Modbus TCP Master这个设备对象并不是所有安装包都默认带如果在添加设备对话框里搜不到去CODESYS Store安装CODESYS Modbus TCP相关套件装完重启IDE再试。还有一点要区分CODESYS Control RTE和CODESYS Control Win不一样。RTE是实时扩展内核把Windows改造成准实时系统适合对抖动有要求的场合Win版本是普通进程方式配置简单但实时性差一点。我做Modbus TCP主站这种百毫秒级轮询场景用Win版本完全够。如果你的项目对周期要求很高那就上RTE版本但配置思路是一样的。2. 第一关IP配置与网络连通2.1 工控机静态IP和Windows防火墙CODESYS做Modbus TCP主站本质是运行在工控机上的软件往网络里发TCP报文。既然是TCPIP就是命根子。我见过太多人一上来就配主站结果从站IP都ping不通还以为是CODESYS的问题。首先工控机这端的网卡必须设置静态IP。有人喜欢用DHCP觉得省事但现场设备一旦多了、交换机一重启DHCP分配地址可能就变了主站配置里的从站IP全部要跟着改很容易漏改一两台导致通讯中断。所以规矩一点所有Modbus TCP网络的设备都用固定IP。Windows下设置静态IP的方法大家应该都会但有个细节容易忽略同一台工控机如果有多个网卡比如一个接办公网、一个接设备网一定要确认CODESYS运行时用的网卡IP是设备网段。否则你配置半天主站和从站根本不在一个广播域里。设置好静态IP后下一步是防火墙。Windows防火墙默认会拦截入站连接Modbus TCP用502端口第一次跑通讯时如果一直超时先检查这个netsh advfirewall firewall add rule nameCODESYS Modbus TCP dirin actionallow protocolTCP localport502这条命令用管理员权限执行把502端口的入站流量放行。我头一次做的时候忘了这茬从站设备侧显示有连接建立但主站这边永远收不到响应排查半天最后发现是防火墙把入站包丢了。如果你用的是企业版Windows或者有第三方安全软件还要额外检查安全策略。2.2 Linux环境下的静态IP配置现在很多工控机跑的是Linux比如树莓派、Ubuntu工控一体机CODESYS官方有Linux版本运行时部署成本和授权成本都比Windows低。但Linux的静态IP配置是个经典坑——特别是Ubuntu系统很多人配完静态IP重启后配置就丢了。Ubuntu 18.04以上版本用netplan管理网络配置。以Ubuntu 22.04为例编辑网卡配置文件sudo nano /etc/netplan/01-network-manager-all.yaml写入以下内容把网卡配置为固定IPnetwork: version: 2 ethernets: eth0: dhcp4: false addresses: [192.168.1.100/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8]保存后执行sudo netplan apply让配置生效。这里最关键的坑是如果你用的是NetworkManager管理网络修改了interfaces文件或者netplan文件但NetworkManager还在跑重启后它会把netplan的配置覆盖掉。所以在设置静态IP后要么关掉NetworkManager要么确认netplan配置里没有冲突项。我的经验是直接停掉NetworkManager服务让网络交给netplan管理sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager否则你配的静态IP大概率在重启后消失CODESYS运行时绑定的IP变了主站通讯全线瘫痪。不管Windows还是Linux配置完IP后建议用一台电脑或者手机连到同一个交换机ping一下工控机的IP确认二层三层都通再继续后面的配置。这一步省下来的排查时间至少是半小时起步。2.3 CODESYS Gateway与运行时扫描IP通了之后先让CODESYS IDE能找到运行时。这一步卡住的人非常多现象是在IDE里点击设备扫描或者选择设备列表里一片空白。CODESYS IDE和运行时之间的通讯由CODESYS Gateway V3负责。安装CODESYS后Gateway会注册成Windows服务或者后台进程。如果你扫描不到运行时先检查这个服务是否在运行。Windows下按WinR输入services.msc找到CODESYS Gateway V3手动启动并且把启动类型改成自动。然后在CODESYS IDE的设备主界面左侧工具栏有个PLC图标点开下拉菜单选择选择设备。如果这个列表是空的点列表上方的设置按钮在弹出的对话框里加网关地址。默认是本机填127.0.0.1。如果你IDE和运行时不在同一台电脑填运行时的IP。运行时扫描还有个大坑CODESYS Control Win V3的版本和你IDE的版本必须匹配。我试过一次IDE装SP17、Runtime装SP15网关扫描能看到设备也能点打开结果一直报设备描述不匹配。这个不匹配的提示还不明显容易被忽略。把运行时跑起来后建议先建一个临时工程在设备树上确认能看到PLC_Logic之类的节点能在线下载程序。这一步通了证明IDE和运行时的通路没问题后面加Modbus TCP主站才不会被环境问题干扰判断。3. 第二关Modbus TCP主站设备配置3.1 从零添加Modbus TCP Master运行环境打通后回到工程开始配置主站设备。在CODESYS的设备树里选中你的控制器设备比如CODESYS Control Win V3右键添加设备在弹出的对话框里搜索Modbus。正常情况下你会在列表里看到Modbus TCP Master这个设备对象它通常在Fieldbuses分类下面。如果搜不到去设备库管理器检查一下Modbus相关库有没有启用或者去CODESYS Store安装CODESYS Modbus TCP套件。添加Modbus TCP Master后设备树会多出一层总线结构。这层结构是逻辑上的你可以把它理解成一个通讯管家——所有Modbus TCP从站设备都挂在它下面。注意这里一个常见误区是把Modbus TCP Master添加到Application节点下面这样逻辑上会乱设备树应该按控制器→总线主站→从站的层级组织。添加完成后在Master节点上右键选择添加设备这次找Modbus TCP Slave。从站节点创建后第一件事是填IP地址和单元标识Unit ID。这两项是建立通讯的核心。3.2 Unit ID、端口与超时参数Unit ID是Modbus协议层面从站地址TCP报文里对应MBAP头的单元标识字节。绝大多数设备默认Unit ID是1如果你的从站设备是单独IP即使Unit ID填0也能通因为TCP连接本身就是点对点的。但为了规范我还是建议按从站设备手册填1到247的合法值。端口号默认502这个一般不用改。如果现场有安全网关做了端口映射或者从站设备用了非标准端口才需要改。等下还有一个容易忽略的点每个Modbus TCP Slave节点只对应一个从站IP。如果现场有多个从站设备每个IP都要单独建一个Slave节点。通道数无上限但别整个工程塞几百个通道轮询时间会拉长。超时时间这个参数我把它单独拎出来强调因为默认值往往太短。在Modbus TCP Master或者Slave节点的属性里有通讯超时Timeout设置默认可能是100毫秒或者300毫秒。现场设备特别是老式仪表响应时间经常不稳定一个扫描周期内有几台设备同时响应偶发超时在所难免。我把超时统一改成500毫秒重试次数改成2次实测稳定很多。还有一个参数叫Continuous Update或者Auto Restart不同版本叫法不同。它的意思是通讯故障后是否自动恢复。建议开启否则主站通讯中断一次后不会自动重新建立连接必须手动重启运行时。3.3 通道Channel配置与功能码选择在Slave节点下右键添加设备选择Channel这一步开始接触Modbus协议的核心——功能码和寄存器地址。Channel可以理解为一条读写请求。一个Channel定义一次Modbus事务读哪个功能码、从哪个地址开始、读多少个寄存器或线圈、数据映射到哪个I/O地址。我习惯按数据类型分Channel比如读所有保持寄存器一个Channel写设定值一个Channel这样后面对应程序变量时非常清晰。功能码是Modbus协议里的操作指令不同功能码对应不同数据区域功能码含义数据区FC1读线圈位操作可读可写FC2读离散输入位操作只读FC3读保持寄存器16位寄存器可读可写FC4读输入寄存器16位寄存器只读FC5写单个线圈位操作FC6写单个保持寄存器16位寄存器FC15写多个线圈位操作FC16写多个保持寄存器16位寄存器我经常看到有人混淆FC3和FC4。记住一个规律保持寄存器Holding Register是可读可写的对应FC3/FC6/FC16输入寄存器Input Register是只读的对应FC4。现场温度、压力这些传感器数值绝大多数是从输入寄存器读用FC4变频器频率设定值这类要写的参数通常在保持寄存器里用FC3读、FC6或FC16写。Channel属性里起始地址一栏填的是协议地址也就是从0开始的地址。这里有个大坑我费了整整一下午才明白单独放一节说。4. 第三关数据映射——从寄存器到PLC变量4.1 那个让人崩溃的1和0地址偏移Modbus协议里数据地址是从0开始编号的。但很多设备厂商的手册、组态软件、上位机界面显示的地址是从1开始的。比如老式仪表手册里写保持寄存器40001是温度这个40001在Modbus协议请求里对应的起始地址其实是0也就是十六进制的0000H。换句话说如果手册写40001你不要在CODESYS的起始地址里填40001而要填0。如果手册写40003对应协议地址是2。我最初看手册写40001起始想当然在CODESYS里填了40001结果数据读回来全是乱的——从站把40001当成了协议地址自然找不到正确寄存器返回异常或者垃圾数据。还有一个变体是地址前缀表示法0开头的是线圈比如00001对应FC1/FC5/FC151开头的是离散输入比如10001对应FC23开头的是输入寄存器比如30001对应FC44开头的是保持寄存器比如40001对应FC3/FC6/FC16如果你不需要读前缀位地址偏移规则是后面数字减1就是协议地址。这个规则在所有Modbus TCP设备上通用但没人明确告诉你——组态软件大多帮你处理了这层偏移CODESYS没帮所以很多人栽在这。我把这个坑写在最前面因为它是数据不对最常见的原因而且极其隐蔽。4.2 通道参数与自动映射明白了地址偏移再回到Channel配置。我以一个实际案例说明某温控仪表温度测量值在保持寄存器40001设定值在保持寄存器40002。读取需求温度值周期性读取设定值偶尔写入。我在Slave节点下建两个ChannelChannel1读保持寄存器FC3起始地址0数量1用于读温度Channel2读保持寄存器FC3起始地址1数量1用于读设定值每个Channel的属性里有一个映射区域。CODESYS会自动为输入通道分配输入字地址比如%IW0、%IW1为输出通道分配输出字地址%QW0、%QW1。这个自动分配是可以手动改的但建议保留默认然后到I/O映射页面把%IW0绑定到你的程序变量上。如果想让映射关系更直观可以禁用在I/O映射页面里自动映射选项然后手动在变量表里新建一个全局变量再把通道的I/O地址映射到这个变量。绑定后程序里直接操作变量和操作一个普通PLC变量没有任何区别但底层数据是靠Modbus TCP从远程从站实时刷新进来的。4.3 32位数据和多寄存器组合Modbus寄存器是16位的但项目里经常要读32位的数据比如REAL浮点数、DINT双整数。这类数据在从站里通常占据两个寄存器那么你至少要读2个寄存器然后在PLC程序里把两个WORD组合起来。这里引出了Modbus系列协议里最经典的坑之一字节序和字序。Modbus TCP传输时每个16位寄存器内部是高字节先发大端这是协议标准规定的。但发电机、仪表厂家在实现时对32位数据的存储顺序常常自己定义有的高字在前有的低字在前。打个比方从站返回两个寄存器值分别是0x4120和0x0000。如果高字在前组合起来是0x41200000按IEEE 754解析是10.0如果低字在前组合起来是0x00004120数值就完全不对了。这就是为什么你看到寄存器有数据但转成浮点数后是天文数字的原因。CODESYS里我建议的做法是读两个连续的Word型通道然后在程序里自己组合。以下是一段组合代码PROGRAM PRG_ModbusCombo VAR wRegHi : WORD; // 通过I/O映射绑定的通道数据高字 wRegLo : WORD; // 低字 rValue : REAL; // 组合后的浮点数 dwTemp : DWORD; END_VAR dwTemp : SHL(DWORD_TO_DWORD(wRegHi), 16) OR WORD_TO_DWORD(wRegLo); rValue : DWORD_TO_REAL(dwTemp); // 如果结果是天文数字试着把wRegHi和wRegLo互换再解析这段逻辑放在一个常规模块里每次更新后执行一次即可。如果发现数值不对把wRegHi和wRegLo互换再验证一次。这是所有Modbus工程师都绕不开的步骤。另外用BYTE数组配合指针也可以实现同样的效果但代码可读性不如直接组合好。我倾向于用上述方法直观且容易排查。4.4 布尔量与线圈的映射细节位变量BOOL在Modbus TCP里对应两类数据线圈CoilFC1/FC5和离散输入Discrete InputFC2。区别在于线圈可读可写离散输入只读。现场设备的状态字、运行信号、报警标志多数以线圈或离散输入的形式暴露。在CODESYS里映射布尔量时一个典型问题是有些人建了一个FC1读通道数量填16然后想把这16个线圈映射到16个BOOL变量上。这在原理上是对的但实际操作时要注意CODESYS对位通道的I/O映射是按字节处理的一个线圈占用1位8个线圈才凑够1个字节。如果你的映射变量声明为BOOLCODESYS会自动处理这1位的映射但如果你用了BYTE数组就要自己注意位的顺序。我遇到过一个现场问题从站返回16个线圈映射到WORD类型变量上结果程序里判断第3个线圈的状态时bit索引对不上——因为CODESYS把Word的第一个bit对应线圈0但有的设备手册把第一个线圈叫线圈1。又是那个0和1的偏移问题位优先级也绕不开它。建议在编程时统一约定设备手册说线圈1对应CODESYS里WORD的第bit0也就是wCoils.0如果你觉得别扭就在注释里写清楚。4.5 符号配置与变量导出在看热词时有个词codesys符号配置出现频率很高。简单说符号配置是CODESYS向外部系统暴露变量的机制。如果你需要把Modbus TCP主站读进来的数据再提供给上位机比如Kingscada、PLC-Recorder、数据库等通常做法是开启应用层的符号配置把这些关键变量打上公开标记。在Application节点下有一个符号配置区域默认是关闭的。需要手动设置变量属性为Symbol然后在符号配置里勾选支持的导出方式。这个机制和Modbus TCP主站本身没有直接关系但实际项目里你总会面临数据读完还要给MES看的需求所以提前做好变量规划建一个专门的GVL放通讯变量比等上位机工程师来催你再整理要省事得多。5. 实战案例三个不同从站设备的对接过程5.1 用Modbus从站仿真软件验证配置动手接真实设备之前强烈建议先用一款Modbus从站仿真软件验证你的主站配置。我用的是Modbus Slave就是Win环境下很常见那款也可以用手头的威纶通触摸屏做模拟从站。Win环境下装好后把它设成Modbus TCP Server模式监听502端口手动填入一些测试数值然后让CODESYS主站去读。这个流程能把主站配置问题和从站设备问题彻底隔离开。假如CODESYS读仿真软件的数据正常那说明主站侧IP、Unit ID、功能码、地址都对了再接真实设备时只需要关注设备本身的数据格式。反过来如果连仿真软件都读不通那就是主站配置有问题别急着让现场设备背锅。仿真软件测试时记得把从站监听地址配成工控机网卡同网段的IP比如192.168.1.200端口502。CODESYS侧从站IP填192.168.1.200。如果数据读不出来先用telnet 192.168.1.200 502测试一下端口通不通通了再继续查CODESYS配置别在协议栈上瞎猜。我这次做项目仿真软件测了半小时确认CODESYS主站侧配置无误后才把现场的温控仪表接上。这样定位问题非常快几乎每个坑都能在半小时内解决。5.2 对接威纶通触摸屏威纶通触摸屏或者说所有主流HMI一般都能作为Modbus TCP从站。现场用威纶通做从站的场景很常见HMI本身采集了现场数据然后上位机或者PLC通过Modbus TCP从HMI读数据。威纶通的EB Pro软件里新建工程时选择设备类型要选Modbus TCP Server或者Modbus TCP Slave不同版本叫法不同。设置本地IP比如192.168.1.88。然后在HMI的标签或地址表里规划好数据地址比如LW0在Modbus TCP协议里对应的地址可能是寄存器地址0。CODESYS侧照常添加Modbus TCP Slave节点IP填192.168.1.88Unit ID填1然后在Channel里按地址去读HMI寄存器。注意威纶通内部有些地址不是标准Modbus寄存器需要查一下EB Pro里的映射表别想当然把LW0直接对应到Modbus地址0。我第一次对接时以为LW就是保持寄存器结果读到的数据和HMI显示完全对不上最后在EB Pro的帮助文档里翻到地址映射表才解决。5.3 对接汇川AM系列PLC做从站汇川AM系列比如AM401、AM402本身就是CODESYS平台它有Modbus TCP Server功能可以作为从站被其他CODESYS主站访问。这个场景在产线多设备联动时很常见一台主控工控机通过Modbus TCP主站去读几台汇川AM PLC的数据。在汇川AM的CODESYS工程里需要开启Modbus TCP Server功能。具体来说在设备树下添加Modbus TCP Slave设备把需要被外部访问的变量映射到Modbus寄存器地址上。这里牵扯到CODESYS的符号配置只有被符号配置公开的变量外部Modbus请求才能访问到。实际调试时我发现汇川AM做从站有个特点是变量映射比较灵活可以把任意一个内部变量映射到任意一个Modbus地址。这意味着你在主站侧读到的寄存器地址很可能和从站PLC里的变量地址毫无规律纯靠从站侧工程师当时怎么映射。所以对接前一定要拿到对方提供的地址映射表别自己猜。主站和从站都是CODESYS环境但两者之间没有任何自动发现机制——CODESYS不会因为你两个工程都是CODESYS就自动交换变量Modbus TCP就是最底层的标准协议两边各配各的。这个认知能避免很多无谓的搜索调试。5.4 与SCADA/数据采集系统的衔接工程做到后面经常还需要把Modbus TCP主站采集的数据送给更上层的SCADA系统比如Kingscada或者PLC-Recorder这类软件。热词里出现的kingscada链接modbus tcp、plc-recorder读取codesys变量都可以理解成这层需求。这里有个常见的方案选择问题上层软件可以直接读现场设备也可以读CODESYS主站。如果上层软件要读的数据就是CODESYS汇总后的程序变量那就别让上层再同时去读现场设备那样会有两份数据源对不上很头疼。更好的办法是让CODESYS对外提供数据接口。但要注意CODESYS默认的变量读取接口比如符号配置未必支持Modbus TCP服务端你需要额外添加Modbus TCP Slave设备把要共享的变量映射到从站地址表里。这样做的好处是数据只在CODESYS内部处理一次对外暴露的是干净、统一的数据集合。缺点是多占一堆通讯点数和周期性扫描时间。根据我实测一个Modbus TCP Slave设备对CPU的占用其实非常低三五个上层系统同时读也扛得住但前提是你的工控机性能别太差。老款Atom处理器上会明显感觉到扫描时间被拉长尽量把主站和从站功能分离到不同网卡或者不同Socket任务里。6. 常见问题与排查技巧实录6.1 连接超时、扫描不到设备现象可能原因解决办法连接超时IP不在同一网段先ping从站IP确认二层三层通连接超时Windows防火墙拦截502端口添加防火墙入站规则连接超时从站未启动Modbus TCP服务用Modbus Poll/仿真软件先自测从站扫描不到PLCGateway服务未启动services.msc手动启动CODESYS Gateway V3扫描到但连不上Runtime和IDE版本不匹配统一版本重新安装运行时连接超时是我遇到过最多的现象。记住一个排查铁律先Ping再Telnet端口最后才查CODESYS配置。Ping不通多半是网络问题Ping通但Telnet 502不通多半是从站服务或者防火墙问题两者都通才轮到CODESYS配置。6.2 地址对不上、数据乱跳现象可能原因解决办法读到的数据全是0起始地址填错填了1-based地址修正为协议地址手册地址减1数据为0或最大值数量Quantity填多了一位严格按数据长度填数量浮点数天文数字高字低字顺序不对交换32位组合的高字和低字字节序不对从站厂商自定义字节序用BYTE数组手动调整字节顺序写操作没反应写功能码选错或从站禁止写确认FC6/FC16检查从站写权限地址偏移和字节序占了Modbus TCP调试问题的一大半。我的建议是做一个固定模板Channel先读2个保持寄存器已知从站里有个明确数值的地址填进去看CODESYS读出来是什么用这个方式快速确认地址偏移和字节序别一上来就大量配置。6.3 通道一直报错、I/O映射变了在通道里如果设置了数量过大比如从站只开放了10个寄存器你偏要一次性读20个从站会返回非法数据地址异常CODESYS侧就会显示通道错误。这种问题从错误信息里能看到是地址非法但很多人以为是从站故障其实只是你要求的寄存器范围超出了从站允许的区间。解决方法是把数量拆小或者查从站文档确认寄存器范围。I/O映射偶尔会出现分配地址冲突的提示多半是你手动改了某个通道的自动分配地址导致与其他通道重叠。最简单的处理是把所有通道的映射恢复成自动让CODESYS重新分配。如果确实需要固定地址确保不同通道的地址范围不重叠。6.4 重启后配置丢失、IP变了这个现象在Linux环境下尤其常见就是所谓的ubuntu配置静态ip后重启配置没有了。前面说了根因通常是netplan和NetworkManager冲突。我建议在工控机上只保留一种网络管理方式要么全用NetworkManager要么全用netplan别混用。混用状态下你改的静态IP大概率在某次重启后被悄悄改回去。另一个类似的坑是CODESYS Control Win在系统重启后没有自动启动。建议把运行时服务设置成自启动Windows服务管理器里找到CONF.RTE服务之类的运行时服务启动类型改为自动。否则现场断电重启后你的主站全部离线还以为是通讯坏了其实是服务没起来。6.5 调试习惯与工具技巧调试Modbus TCP主站我始终推荐先用工具验证从站再用CODESYS对接的流程。Modbus Poll这类主站仿真工具可以让你在几分钟内确认从站的地址表、数据类型、读写权限。很多工程师跳过这一步直接上CODESYS遇到问题还要反复猜测是主站问题还是从站问题效率极低。另外CODESYS在线模式下可以在监视窗口里实时看I/O映射变量的值变化。这个功能比在程序里加断点方便得多。把通道的循环时间拉长一些比如默认的100ms调到500ms调试时逐个通道分析找到问题再把周期调回来。别一上来就所有通道秒级循环一旦出了问题日志里全是超时记录反而看不出规律。最后再分享一个小习惯改主站配置前先点一次CODESYS的生成按钮。很多地址越界、类型不匹配、映射冲突会在生成阶段直接报错。等生成通过后再下载到运行时。这个习惯帮我挡住了至少一半的现场低级错误。这次项目做完后我最大的感受是Modbus TCP主站的配置门槛其实不高难的是它面对的设备千奇百怪文档还经常含糊。如果能把IP规划、地址偏移、字节序这几个核心概念吃透再找我上面说的工具验证法去排查基本能解决90%的问题。剩下10%属于从站设备自身的怪癖那就要靠和现场工程师耐心沟通了。
返回列表