ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CODESYS连接触摸屏全攻略:协议选型、地址映射与排查方法

CODESYS连接触摸屏全攻略:协议选型、地址映射与排查方法 干工控这些年CODESYS连接触摸屏这个问题被问过无数次。很多人不是不会写PLC程序而是卡在“写好的变量怎么让触摸屏读得到”这一层。其实CODESYS本身只是一个软件生态真正的通信链路需要你自己搭触摸屏品牌五花八门威纶通、昆仑通态、台达、MCGS驱动方式大同小异但细节上各有脾气。这篇文章我把项目里反复验证过的连接方法、协议选型、地址映射、排查套路一条条捋清楚不管你手头是真实PLC还是仿真器都应该能找到直接抄作业的部分。1. 连接之前先理清协议和硬件关系1.1 触摸屏连CODESYS的本质变量映射与地址翻译先说一个很多初学者容易搞混的概念触摸屏和CODESYS里的PLC程序并不是“连上”就能互相看到变量的。触摸屏本质是一个独立的嵌入式设备它既不知道你PLC程序里有个变量叫bStartMotor也不知道iSpeed存在哪个内存地址。它只知道“我通过某个协议去读写某个地址/某个变量名”。所以连接的本质是在两端之间做一个翻译一端把PLC内存里的数据变成协议报文另一端把报文解析成触摸屏元件能绑定的地址或变量。CODESYS这边通常是这样你写好的PLC_PRG或者其他 POU 里的变量需要被“暴露”给外部。暴露有两种常用方式在 CODESYS 里启用符号配置Symbol Configuration允许外部通过变量名直接访问。在 CODESYS 里挂一个通信协议栈比如 Modbus TCP Slave、OPC UA Server把变量映射到寄存器或节点上。触摸屏那边则是反过来的。它要么去“读变量名”通过支持 CODESYS 符号访问的驱动要么去“读寄存器”通过 Modbus TCP、OPC UA 等通用驱动。理解了这个关系后面所有的配置步骤就都好懂了。1.2 主流通信方案怎么选Modbus TCP、OPC UA、EtherCAT与自由标签方案选型直接影响后面的工作量这里我给一张适合实际项目参考的对照表通信方式适用场景优点注意点Modbus TCP触摸屏与CODESYS PLC走以太网最通用几乎所有触摸屏都支持配置简单布线方便需要做寄存器映射地址偏移和数据类型要小心Modbus RTU (485)老设备、距离短、触摸屏只有串口成本低抗干扰尚可速度慢接线/站号容易出错OPC UA需要跨平台、跨网段、加密传输变量名直接访问免地址映射安全性好部分老触摸屏不支持配置稍复杂CODESYS Symbol 自由标签触摸屏驱动支持 CODESYS V3 符号访问变量直接拖拽无需关心寄存器地址屏和PLC品牌兼容性约束较强EtherCAT高端运动控制、需要实时同步实时性最强触摸屏一般不做EtherCAT主站应用较少从我的实际经验来看90% 的场景直接走Modbus TCP最稳妥。原因很简单威纶通、昆仑通态、台达、MCGS 这些主流触摸屏都内置了 Modbus TCP 驱动你不需要在触摸屏侧装额外的东西。而 CODESYS 侧只要加一个 Modbus TCP Slave 库把需要给触摸屏的变量映射到保持寄存器上剩下的就是地址表的事情了。OPC UA 是这几年的趋势如果项目里用的是新版本触摸屏并且支持 OPC UA Client我非常建议优先考虑。它省去了寄存器映射这步最繁琐的工作直接用变量名访问而且支持用户名密码校验不用盯着防火墙纠结端口。但代价是调试门槛高一些尤其是证书配置那一块首次配置容易懵。自由标签通信这块很多组态软件或者触摸屏厂商自己的驱动做得很“香”。我之前用 Leadsys Studio 做过仿真环境下的自由标签通信只要 CODESYS 工程启用了符号配置组态软件里就能直接浏览到 PLC 变量不需要填寄存器地址。这种体验确实爽但前提是触摸屏/组态软件必须认识 CODESYS 的符号协议或者通过 OPC UA 中转。2. CODESYS工程侧的准备2.1 先把符号配置做对自由标签通信才有入口如果你想把 CODESYS 变量直接暴露给外部系统无论走 OPC UA 还是自由标签第一件事就是配置 Symbol Configuration。在 CODESYS V3 的工程树里右键点击“Application”选择“添加对象”找到“符号配置”Symbol Configuration。添加后会看到一个配置页面左侧把工程里所有 POU、全局变量列表都列出来了。你需要做的是把需要开放的 POU 或变量勾选上比如PLC_PRG、GVL_ProcessData。在右侧“符号”列勾选要暴露的变量可以使用通配符批量选择比如PLC_PRG.*。设置“支持 OPC UA 访问”等选项这取决你的运行时版本和目标设备是否支持。编译下载后外部客户端就能通过 OPC UA 浏览到这些变量。我自己踩过一个坑刚开始图省事把整个PLC_PRG都勾选了结果 OPC UA 客户端里刷出来几百个内部变量反而不好找。后来在项目里养成了习惯单独建一个全局变量列表比如GVL_HMI所有要开放给触摸屏的变量都集中放进去符号配置只勾选这一个列表。这样既清晰又免得内部标志位被外面乱写。2.2 生成和导出库文件、符号表喂给触摸屏工具热词里有“CODESYS如何生成库文件”这在连接触摸屏的流程里其实很常见。如果你要复用一套通信封装比如 Modbus 映射功能块、数据解析程序就可以把这些程序打包成库文件免得每个项目重新写。生成库文件的方法是在 CODESYS 工程里选中你要打包的 POUs 或功能块右键选择“保存为库”Save as Library。保存的时候设置好库名称、版本号、公司名还可以写一段说明。之后在别的工程里打开库管理器安装这个库文件就能像用内置库一样调用里面的功能块了。但如果你是为了让触摸屏工程导入变量表更常用的是导出符号文件。比如在符号配置里编译后可以导出 XML 格式的符号表威纶通、MCGS 这些软件通常支持从 XML/CSV 导入变量标签。这样你不需要手工维护一张 Excel 地址映射表直接把 PLC 侧的变量清单导入触摸屏工程省去一半时间。需要提醒的是库文件和符号表是两个不同用途的东西。库文件给 CODESYS 程序员复用代码用符号表给外部通信/触摸屏配置用。别搞混。2.3 数据库类库与变量采集的扩展玩法热词里还有“CODESYS 数据库类库”和“MySQL的alongwu第三方库(codesys)”这块虽然不是连接触摸屏的必要步骤但很多项目会顺带做数据采集。CODESYS 官方有数据库库支持通过 ODBC 接口访问数据库。我试过在 CODESYS 里直接调用 ODBC 功能块把设备产量写入 MySQL。配置比较繁琐要装 ODBC 驱动、配置数据源而且库的版本和你安装的 CODESYS 版本要匹配否则编译会报一堆找不到功能的错误。如果你不想折腾官方库网上有个alongwu的第三方 MySQL 库作者封装好了连接、执行 SQL 的功能块调用起来会直观一些。不过第三方库的坑在于它依赖的底层接口和 CODESYS 版本绑定很紧我用 CODESYS V3.5 SP15 的时候正常换到 SP17 就发现某些功能块跑不起来。所以用第三方库之前一定先在虚拟机里做兼容性测试。至于 PLC-Recorder它是个独立的软件专门用来采集 PLC 变量并记录到文件或数据库。它同样可以通过 CODESYS 的 OPC UA 接口来读取变量不占用 PLC 的 Modbus 寄存器资源。如果你既要触摸屏显示又要后台采集可以考虑分开走触摸屏走 Modbus TCPPLC-Recorder 走 OPC UA互不干扰。3. 触摸屏侧配置实例3.1 威纶通走Modbus TCP从新建工程到元件地址威纶通是市面上反馈资料最多、我也用得最多的屏。拿它和 CODESYS PLC 走 Modbus TCP 为例流程大概是这样的打开 EBpro 软件新建工程选择对应触摸屏型号。在设备列表里新增一个设备PLC 类型选择 “Modbus TCP”。设置 PLC 的 IP 地址CODESYS 控制器所在机器的 IP和端口号默认 502。如果触摸屏作为 Master多数HMI都是Master主动去读那么 PLC 侧要运行 Modbus TCP Slave 功能块监听 502 端口。这里最关键的一步是地址映射。CODESYS 的 Modbus TCP Slave 功能块需要你把 PLC 变量手动填入“保持寄存器区”。通常 32 位整数占用两个寄存器16 位整数占用一个寄存器。如果你在触摸屏元件里填4x 400101那么它访问的就是 Modbus 保持寄存器的第 100 号地址偏移关系看具体功能块定义。我常用的一个做法是在 CODESYS 里新建一个Modbus_Map功能块内部用一个数组HoldingRegs[0..999]映射所有与屏交互的变量然后通过ModbusTCPSlave功能块把数组暴露给网络。触摸屏侧填地址时直接用“400001 数组下标”简单粗暴。数组里每个元素默认是按 16 位 Word 来存需要读写 32 位浮点数时记得在触摸屏元件里选择“32-bit Float”并确认字节顺序ABCD 还是 BADC不然显示出来的数会非常离谱。还有一个小技巧威纶通里很多老项目的元件地址填的是4x 400101但实际上有的驱动把地址偏移量按 1 算有的按 0 算。调试时如果发现数据整体偏移 1 个字把地址加减 1 试试。3.2 昆仑通态、台达、MCGS的线缆与参数差异昆仑通态MCGS的触摸屏在国产设备里占有率很高它走 Modbus TCP 的配置思路和威纶通类似但软件界面差异大。MCGS 嵌入版里选择“通用 TCP/IP 父设备”再添加“莫迪康 ModbusTCP”子设备然后设置网络参数。它的元件地址结构是“设备号 寄存器区 地址”比如4#400101这个4#表示 4 号保持寄存器区别漏掉。如果你用的是串口 485 连接需要注意的细节就更多了。PLC 侧如果通过一个 RS485 模块转 Modbus RTU触摸屏侧要设置一致的数据格式波特率、数据位、校验位、停止位还有站号。最常见的故障是“屏和PLC之间用 USB 转 485 调试线连上了但数据全乱”十有八九是 A/B 接反或者地线没共地。我习惯先用万用表量一下 A/B 电压静止状态下应该在 2V 到 6V 之间如果接近 0V别急着查参数先检查线。台达的触摸屏 DOPSoft 软件里新建工程时也有标准 Modbus 驱动选以太网接口后填 PLC 站的 IP 和端口。台达自家有些 PLC 本身是 CODESYS 平台如果是这种组合可以直接选台达 CODESYS 专用驱动配置会简单一些。但如果你用的其他品牌的 CODESYS 设备还是老老实实走 Modbus TCP。关于“昆仑通态触摸屏上的配方数据怎么给到PLC”我的建议是配方数据存在触摸屏的配方数据库中写组态脚本把某条配方的多个字段写到 Modbus 保持寄存器里。诀窍是写完后置位一个“配方负载更新”寄存器让 CODESYS PLC 检测到这个上升沿后再批量读入。否则 PLC 边读边写容易读到半新半旧的数据。3.3 仿真环境下连接外部触摸屏Leadsys、CODESYS Control Win的实战操作很多时候我们手头没有真实 PLC 硬件只有 CODESYS 的仿真器。其实仿真器完全可以当成一个“运行在电脑上的软 PLC”来和触摸屏通信。CODESYS 的的仿真运行环境通常叫 CODESYS Control Win V3安装 CODESYS 开发环境时一般会一并装上。启动后你把工程里的设备Device改成 Control Win V3然后登录并启动 PLC这时候电脑本机就监听在相应的网络端口上。触摸屏只要能和这台电脑在同一个局域网内就可以通过 IP 访问到它。我第一次用仿真器带威纶通触摸屏的时候遇到一个问题触摸屏上所有元件都不通后来排查发现是 Windows 防火墙把 502 端口拦了。解决办法是在防火墙入站规则里放行 CODESYS 运行时和 Modbus TCP 端口或者在开发电脑上加一条“允许所有本地端口被局域网访问”的规则。Leadsys Studio 这类组态软件我也试过它在仿真模式下支持“自由标签”通信意思是只要配置好 CODESYS 的 OPC UA 地址组态里就能直接下拉选择 PLC 变量和威纶通填 Modbus 地址的体验完全不一样。这种方式的优点是直观、可读性强缺点是仿真器如果没开 OPC UA Server列表里什么都刷不出来。所以我的建议是仿真现场先用 OPC UA Client 测试工具比如 UA Expert去扫一下opc.tcp://localhost:4840能连上再去组态那边配置。还有一点容易踩的坑CODESYS Control Win 仿真器的网络绑定。有些人电脑又插着网线又连着 WiFi触摸屏走无线网但仿真器绑定到了有线网卡的 IP导致触摸屏始终 ping 不到。要避免这个问题在系统服务里确认 CODESYS Control Win 服务绑定的地址或者干脆把两台设备都接到同一个交换机手动指定静态 IP。4. 常见问题与排查技巧实录4.1 连不上先排查IP、防火墙、端口、站号触摸屏和 CODESYS 通信连不上我总结出一个四步排查法每次照着做基本能定位 90% 的问题。第一步网络通不通。在触摸屏的调试页面里或者在电脑上用命令行pingPLC 的 IP。如果 ping 不通别查协议先查网线、交换机、IP 地址是否同网段。仿真器环境要注意 Windows 防火墙威纶通官方资料里也写得很清楚调试前先把防火墙关掉或者放行相关端口。第二步端口通不通。Modbus TCP 默认端口 502OPC UA 默认端口 4840。可以用一个简单的 TCP 工具去连接这个端口只要能连上说明通信链路已经建立了。第三步协议栈有没有在跑。CODESYS 里如果没把 Modbus Slave 功能块加到任务里去循环调用或者功能块没有使能即使端口通了触摸屏发来的请求也没有程序去响应。检查方法是在线监视功能块的xActive或者日志输出。第四步站号和地址对不对。Modbus RTU 要确认站号Modbus TCP 有些屏也要求填站号默认 255 或者 1填错也会一直超时。地址偏移问题我单独说因为它很隐蔽。4.2 触摸屏显示值乱跳、数值差一倍地址偏移与字节序如果你连上了但是显示出来的数据和 PLC 里完全对不上这通常不是“连接问题”而是“解析问题”。最常见的是地址偏移错位。比如 PLC 里变量放在保持寄存器的第 0 个位置触摸屏地址填 400001这是 0 偏移如果把 PLC 的 Modbus 地址映射功能块里面设置的unitID或者offset算进去实际到了 400002你就会发现读出来的永远是下一个变量的值。排查方法很简单放一个已知常数到数组第一个元素比如HoldingRegs[0] : 12345看触摸屏能不能显示出来然后依次测 [1]、[2]就能确定实际偏移是多少。第二个坑是字节序。32 位整数或浮点数在 Modbus 报文里有两个字一个字是低 16 位一个是高 16 位。不同触摸屏解析时可能把高字放前面也可能把低字放前面。CODESYS 的 Modbus 库字节序可以在功能块的参数里配置也可以在触摸屏元件的数据格式里选择。如果你发现数值差得离谱比如 1.0 显示成 16256或者整数 1000 显示成 65536基本就是字顺序反了。第三是数据类型。CODESYS 里的INT16位有符号和UINT16位无符号在触摸屏上要选择对应的格式。如果你把 INT 当 UINT 读负数会变成很大的正数把 DINT 当 INT 读32位数据会被截断。所以在建立触摸屏变量表时一定要严格对应 PLC 侧的数据类型。4.3 触摸屏本体“没反应”驱动、触摸校准与外设干扰有时候调试了半天最后发现不是通信问题而是触摸屏本身的触摸功能失灵。热词里那些“TouchKit 红外触摸屏驱动”“MateBook E Go 触摸屏没反应”本质上都是驱动/系统层面的问题但搞工控的也会遇到。我碰到过一台安卓系统触摸屏装机后怎么点都没反应最后发现是固件里的触摸屏驱动版本不对重新刷了对应红外触摸屏驱动才恢复。如果是 Windows 系统的触摸屏还要注意屏幕方向设置有些屏竖装但你用的是横屏程序触摸坐标会整体偏移看起来就像“点不准”甚至“没反应”。这时候去 Windows 的“平板电脑设置”里重新校准一下或者改一下屏幕方向就好了。回到 CODESYS 调试现场还有几种“触摸屏没反应”和通信无关的原因触摸屏程序没有下载到屏里面只停留在离线模拟状态触摸屏的“系统菜单”里触控蜂鸣被关掉了让人误以为没点上或者屏的背光正常但程序被隐藏了实际停在了一个空画面。排查优先级是先看屏幕有没有错误弹窗再看屏的日志里有没有通信超时记录最后再怀疑触摸硬件。4.4 提高连接可靠性的几个习惯项目做多了就会发现稳定不是靠运气而是靠习惯。在 CODESYS 侧我习惯把所有 HMI 通信变量集中到一个专门的全局变量表比如GVL_HMI并且对这些变量做统一的数据类型规划。该用INT的地方别用REAL通讯有延迟浮点最好转成整数比如乘以 10 再传输可以避免模数转换的微小误差。在触摸屏侧我会把“读取超时时间”和“重试次数”设置成一个合理的值。超时太短网络闪断一下就会弹警报太长故障反应慢。一般我设 3 秒超时、3 次重试。CODESYS 的 Modbus 功能块内部也有超时参数两边时间要匹配不能出现 PLC 侧超时设置 5 秒触摸屏侧 1 秒就认为失败的情况。另外HMI 程序的工程文件一定要用含日期和版本的命名备份。我在现场吃过亏上午调好的屏下午改系统画面时不小心覆盖了后来重新配地址表花了两个小时纯属交学费。5. 实战小技巧调试助手、配方下发与方案速查5.1 MCGS触摸屏调试助手怎么用很多人都问过“MCGS触摸屏调试助手怎么用”这里统一说一下思路。MCGS 的调试助手类工具本质是一个软件模拟的触摸屏通信端用来直接发送 Modbus 命令给 PLC。调试时你先在工具里填好 PLC 的 IP 和端口选择功能码比如 03 读保持寄存器再输入要读取的寄存器起始地址和数据长度点发送就能看到 PLC 返回的原始数据。这一步能有效区分问题出在“PLC 没响应”还是“触摸屏配置不对”。如果返回的原始数据是正常的但触摸屏上就是显示不对那问题一定在触摸屏工程内部的地址/数据类型配置上别再去反复重启 PLC 了。用调试助手还有一个好处是能验证 PLC 侧 Modbus 映射是否生效。你可以在 CODESYS 里强制把一个变量改成固定值然后通过调试助手读一次看看返回的字节和预期是否一致这样就把“变量名—映射地址—报文数据”整条链路打通了。5.2 配方数据下发的标准做法配方数据从触摸屏下发到 CODESYS PLC建议不要直接在屏幕上“写寄存器”。因为配方可能有十几个甚至几十个参数触摸屏一个元件一个元件地写PLC 可能读到中间状态。标准做法是“数据块加握手”在触摸屏组态里把配方当前值写到连续的 Modbus 保持寄存器区域比如400101到400120。触摸屏脚本或按钮动作里把一个“请求写入”的位置位比如400130的 Bit0 置 1。CODESYS 里写一个检测逻辑等到400130.Bit0出现上升沿才批量从400101到400120读取数据然后赋值给 PLC 内部配方变量。PLC 完成这些变量更新后把“完成”位置 1并复位请求位触摸屏检测到完成位以后再刷新显示当前配方号。这样做的最大好处是写入操作是一个完整的事务不会出现“一半新配方一半旧配方”的脏数据。我在多家现场都用这套逻辑稳定得很。5.3 连接方案速查表最后给一张我在选型时经常对照的速查表适合直接截图保存项目需求推荐方案关键点威纶通屏 CODESYS PLCModbus TCP新建工程选 Modbus TCPIP 和端口务必一致昆仑通态MCGS CODESYS PLCModbus TCP / RTU父设备选通用 TCP/IP 父设备地址加设备区前缀台达屏 CODESYS 平台 PLC优先尝试厂商 CODESYS 专用驱动不支持的话退回 Modbus TCP仿真器 触摸屏联调CODESYS Control Win Modbus TCP检查防火墙、运行时绑定网卡需要跨网段/加密OPC UA启用符号配置触摸屏选支持 OPC UA 的型号后台数据采集PLC-Recorder 走 OPC UA避免占用 Modbus 寄存器资源数据库存储CODESYS 官方 ODBC 库或 alongwu 第三方库提前验证版本兼容性配方批量下发Modbus 连续寄存器 握手触摸屏写请求位PLC 批量读这些方案并不是唯一的但是我在大量项目里用过、趟过坑之后筛出来的。实际动手时尽量先在一个小工程里把 PLC 和触摸屏连通跑通一个变量再扩展到完整画面。因为连接问题往往卡在最基础的环境配置上小规模验证能帮你快速定位是通信问题还是工程规模带来的复杂问题。
返回列表