资讯详情

汇川AC700 PLC基于Codesys编程:从基础指令到通信配置实战

📅 2026/9/13 12:43:25 | 华诺云谱 👁 阅读
汇川AC700 PLC基于Codesys编程:从基础指令到通信配置实战
1. 开发环境与工程搭建1.1 为什么AC700会跳到Codesys拿到汇川AC700系列的第一天大多数人会和我一样下意识去找汇川自家的编程软件。结果发现这玩意儿根本不是一个传统意义上的“汇川全家桶”它的开发环境叫Codesys准确说是基于Codesys内核深度定制的平台。很多做过H系列、H1U系列的老工程师第一次打开这个界面都会愣一下——软件不对了指令不对了连变量声明的方式都不一样了。这里得把底层的逻辑说清楚。Codesys本身就是工控圈里非常成熟的IEC 61131-3编程环境全球大量PLC品牌包括很多欧洲老牌都直接拿它做内核自己只做硬件驱动和工艺插件。汇川把AC系列、AM系列这些中型PLC架在Codesys上等于直接继承了整个Codesys生态五类标准编程语言、第三方库、可视化、OPC UA、EtherCAT主站能力。这在运动控制、视觉联动、工厂信息化这些场景里优势非常明显但也意味着你不能拿老经验硬套得先学会跟Codesys“对话”。这篇文章就围绕AC700系列把基础指令逐类拆开从建工程到位逻辑、定时器计数器再到数据转换、MODBUS和EtherCAT通信最后把我在现场踩过的坑一并列出来。适合同样刚转Codesys的PLC工程师、设备维护人员和想入工控门的学生如果你已经会三菱或者西门子那看这篇文章上手会非常快。1.2 软件安装、版本匹配和在线连接先用最简单的方式描述安装这件事去Codesys官网申请一个账号下载Codesys Development System V3.5的安装包或者去汇川官网的软件下载中心找AC700系列对应的编程软件安装包。两种方式都可以第二种更省事因为汇川在安装包层面会把自己设备的描述文件、库文件都预装好省得你后面满世界找东西。安装过程没什么玄学一路Next就行。但有一件事容易被忽略AC700系列对Codesys的版本有对应关系不同批次、不同固件版本的控制器要求的最低Codesys版本不一样。我碰到过同事拿着最新版Codesys去连一台老固件的AC700结果设备扫描死活找不到折腾半天最后换回对应的旧版本一次就连上了。所以装完软件先别急着写程序看一眼控制器固件版本再确认一下你的软件版本在支持列表里这能省掉后面一大堆莫名其妙的问题。连PLC也是个容易卡住的点。AC700系列的连接方式一般是以太网为主面板上或者端子上有网口默认IP印在机身标签上常见的是192.168.1.x网段。连接步骤是在Codesys里新建工程后在“设备”树中选中控制器右键扫描网络或者双击打开“通讯设置”再点扫描。如果你已经把电脑网卡IP改到了同一网段还是扫不到大概率是Windows防火墙拦了Codesys网关把Codesys Gateway Service的入站规则放行就可以了。这个连接原理值得多说一句Codesys的在线通讯不靠PLC直接响应当前软件中间夹了一个叫“网关”的本地服务。它负责把开发电脑上的请求转发到PLC内部的通讯进程所以网关服务异常、防火墙拦截、PLC处于STOP状态或另一个工程师占用了连接都可能导致“扫描不到设备”。排查顺序建议是网线物理通断→电脑IP和PLC同一网段→防火墙→网关服务状态→PLC是否被其他人占用。很多新人在这个阶段就会失去耐心觉得“这软件怎么这么难伺候”。实际上只要理解了“电脑—网关—PLC”这条链路后面所有连接问题都能按这个思路一节一节排查。2. 基础指令的知识骨架与思维切换2.1 从继电接触器图到IEC 61131-3的语言做PLC的人都有个共同记忆最早接触的编程方式就是梯形图画起来和继电器回路很像线圈、触点、自锁、互锁思路完全是从电气图搬过来的。三菱、西门子的软件里就算你用梯形图逻辑也是按扫描周期逐行执行的但汇川AC700这套Codesys环境有一个显著不同它把“任务”这个概念放到了台面上。任务决定程序什么时候执行、以多快的周期执行而工程里可以同时有多个任务分别跑不同优先级的功能块。这意味着基础指令不再是“死记指令表”而是要先理解程序运行机制。一个典型的AC700工程里你会看到“任务配置”下面有若干个周期性任务比如MainTask周期1ms、CyclicTask周期10ms每个任务下面挂不同的程序组织单元POU。你在梯形图里画的每一行逻辑最终都会落到某个任务里由这个任务的周期来驱动。这个思路一旦建立后面做运动控制和高速模拟量处理时就不会犯“把所有东西堆在一个循环里”的错。IEC 61131-3定义了五种语言指令表IL、结构化文本ST、梯形图LD、功能块图FBD、顺序功能图SFC。AC700系列全部支持而且允许不同POU用不同语言再在任务里互相调用。实际项目里逻辑简单、维护人员偏电气背景的场合用梯形图运算复杂、数据处理多的场合用ST流程明显、分步骤控制用SFC。语言从来不是束缚你完全可以把ST当成一种“能直接操控硬件寄存器的类C语言”来用。2.2 位逻辑、边沿、置位复位的使用要点基础指令最核心的一类就是位逻辑。触点常开、常闭、线圈、置位S、复位R、取反这些在梯形图里非常直观。但有几个在Codesys里特别容易出错的细节我一个个说。第一个是常闭触点的处理。很多从三菱转过来的人会把常闭触点理解成“逻辑取反”。在扫描执行时这种理解问题不大但是在程序里的某个线圈只在条件满足一个扫描周期就立即复位时常闭触点和置位复位之间的配合就容易产生怪逻辑。我的建议是凡是需要保持状态的地方优先写S/R置位/复位而不是用线圈自锁。这样逻辑短、直观也不容易被后面的人改乱。第二个是边沿检测。Codesys里提供了R_TRIG上升沿和F_TRIG下降沿功能块使用时要声明两个变量一个是功能块实例一个是输出变量。重点来了R_TRIG检测的是“上一次扫描的值到这一次扫描的值”之间是否发生跳变所以功能块实例必须能被重复调用这就意味着你不能把R_TRIG放在一个IF分支里只在某一次扫描时执行。如果这样写功能块内部的上一状态不会被持续刷新边沿就永远触发不了。正确做法是每次任务周期都无条件调用它然后把输出接到你的逻辑里。第三个是位操作和字节/字操作的混用。AC700里你可以用变量名.0这种形式访问某个BOOL位代码写起来很方便但调试起来要小心。如果一个字节里多个位分别代表不同的报警信号在梯形图里用点位符连线没问题可一旦要传到触摸屏或上位机必须清楚位的排列顺序是LOW位在前还是HIGH位在前这个后面讲通信时还会再碰到。2.3 定时器、计数器家族和它们的坑定时器这块Codesys提供的TON延时接通、TOF延时断开、TP脉冲和RTC实时时钟是基础指令里的重头戏。绝大部分控制逻辑都离不开定时。我见过很多初级工程师写延时断开直接用TON再取反输出结果DEBUG时发现输出闪了一下又变了。这是因为TON的输出在定时未完成时是FALSE一旦时间到就变TRUE你把它取反那就是说前面的状态要么TRUE要么FALSE合在一起看起来像“闪了一下”。这里真正要做的是想清楚时序延时断开TOF的逻辑是输入有信号时输出立刻为TRUE输入断开后输出再保持一段时间它和“TON取反”在语义上不是一回事。建议把这三个定时器的真值表画在纸上逻辑就清楚了。计数器常用的有CTU加计数、CTD减计数、CTUD加减计数。使用时注意CV当前值和PV预设值的数据类型通常是INT或DINT别混着用。如果计数的来源是编码器脉冲频率很高建议把计数任务挂到专门的快速任务里并且用DINT足够大的范围避免溢出。另外说一个非常典型的坑定时器/计数器功能块的输入输出在梯形图里直接接BOOL变量或者数变量是没问题的但如果你在ST里调用TON必须同步做一些数据类型的检查。TON的IN引脚是BOOLPT引脚是TIME这两个搞错了编译都过不去。TIME的写法是T#5s、T#100ms这种新人经常把5000直接填进去结果定时器瞬间动作因为5000被当成5000毫秒微秒级别的极短时间。记住TIME是带单位的时间字面量不是数值。3. 从零搭一个基础逻辑自锁、延时、旋转角度动画3.1 电机启保停与故障复位与其干讲指令不如直接过一遍实际案例。假设你要做一个电机启动停止控制有启动按钮、停止按钮、故障信号、运行输出。在AC700里新建一个POU语言选择LD梯形图代码结构和三菱差不多但要注意一点在Codesys里线圈的输出变量一般定义为全局变量或POU内的VAR_OUTPUT不要直接在梯形图里写一个地址那样可读性差且维护困难。逻辑很简单启动按钮常开触点START和运行输出RUN的常开触点并联形成自锁停止按钮用常闭触点串在回路里故障信号用常闭触点串在回路里故障时直接断开输出接RUN。如果你用ST写同样逻辑是RUN : (START OR RUN) AND NOT STOP AND NOT FAULT;这段代码和梯形图严格等价。但实际使用中我强烈建议把“故障”做成独立复位逻辑而不是简单串一个常闭触点。因为故障信号往往需要保持电机停了之后故障触点还保持闭合你不复位它再次按启动就无效。所以更合理的写法是IF NOT RESET THEN FAULT_LATCH : FAULT_RAW; END_IF RUN : (START OR RUN) AND NOT STOP AND NOT FAULT_LATCH;这段逻辑的好处是故障来了RUN断开按下复位按钮后故障锁存被清掉才能重新启动。这种锁存方式在真实设备上比单纯串联常闭触点可靠得多。3.2 定时器在设备启停中的时序控制很多设备启动过程中需要先开冷却、再开油泵、最后才给主轴使能。这种顺序控制如果用ST写最直观的是用几个TON搭“接力棒”。// 启动顺序控制 bCooling : bStart; // 冷却立刻启动 TON_Oil(IN : bCooling AND NOT bStop, PT : T#3S); bOilPump : TON_Oil.Q; // 3秒后油泵启动 TON_Spindle(IN : bOilPump AND NOT bStop, PT : T#5S); bSpindle : TON_Spindle.Q; // 再过5秒主轴使能这样写逻辑清晰每个设备都有自己独立的延时条件不会出现“多个定时器共用一个启动信号然后一停全停”的混乱。停止时也一样推荐做一个对称的停止时序主轴先停、3秒后油泵停、再2秒后冷却停。这种顺序控制在机械设备里非常普遍也是定时器最典型的应用场景。3.3 从编码器读数到旋转角度可视化热词里有个“codesys中旋转角度动化”其实是指用Codesys自带的可视化Visualization功能做旋转动画这在设备状态监控界面里很常见比如显示一个指针角度、搅拌叶片位置、转台方向。要实现旋转动画前提是你已经拿到了一个角度值。如果电机或转台带编码器那么角度来源就是编码器计数。AC700配合汇川伺服时伺服驱动器的位置反馈可以通过EtherCAT或总线映射到PLC变量里通常是一个INT或DINT类型的脉冲计数值。把脉冲计数值折算成角度最简单的公式是rAngle : (LREAL_TO_REAL(diCount) / LREAL_TO_REAL(udiResolution)) * 360.0;这里的diCount是当前脉冲数或相对零点脉冲数udiResolution是编码器每圈分辨率。以汇川MS1H4系列伺服为例默认编码器线数是262144即2的18次方表示电机转一圈位置反馈有262144个脉冲单位。用count除以分辨率再乘以360就是当前角度。如果角度只用于显示建议在程序里规范化到0~360度范围内避免指针转了好几圈后数值越来越大rAngleDisplay : rAngle - TRUNC(rAngle / 360.0) * 360.0;写完后打开可视化界面拖一个“圆形”或“图片”元素在元素的“旋转”属性里绑定rAngleDisplay变量设置旋转中心和旋转方向即可。有几个细节值得注意旋转中心默认是元素左上角需要手动设置为中心点方向正负要看编码器计数方向和机械安装方向反了就直接在公式后面加负号可视化里的刷新率默认可能只有50ms级别高速转动时会有显示滞后但不影响实际控制只是监控显示而已。编码器分辨率这块有人会问驱动器里看到的262144这个数值能不能改我的建议是原则上不要改。那是电机绝对编码器的硬件精度强行改成别的数值PLC侧算出来的角度和实际机械位置就会对不上还会影响电子齿轮比和定位精度。除非你明确知道后端负载和减速比需要重新标定否则保持默认。4. 数据类型的转换与通信实操4.1 DWORD转REAL的位模式陷阱工控里最常见的一类头疼问题就是32位数据在内存里的表示方式。热词里有个“汇川AM系列DWORD怎么转REAL”这个问题在AC700上同样会遇到而且问得非常典型。先说结论DWORD转REAL不是把整数“转成”小数而是把同样的一组二进制位重新解释成IEEE 754浮点数。比如某个设备通过MODBUS返回了两个寄存器里面装的是16#3F800000如果你把它当成DWORD那就是整数但如果你知道协议约定这个数据是REAL类型那16#3F800000在IEEE 754里就是1.0。这两个值天差地别硬转必然出错。在Codesys里做位模式转换最实用的办法有三个我按推荐顺序排第一个是使用联合体。Codesys支持在DUT里定义UNIONTYPE U_DWORD_REAL : UNION dwValue : DWORD; rValue : REAL; END_UNION END_TYPE程序里这样用varTemp : U_DWORD_REAL; varTemp.dwValue : 16#3F800000; rResult : varTemp.rValue; // rResult 1.0这个方式直观、高效不会产生中间拷贝是我最常用的方案。第二个是用指针。如果你不想建联合体用ADR和指针也可以pReal : POINTER TO REAL; pReal : ADR(dwInput); rResult : pReal^;这段代码先把DWORD变量的地址取出来再按REAL类型解引用本质上是同一段内存换了一种解释方式。运行效率极高几乎没有额外开销。但要小心指针悬空必须在指针赋值后确认不是NULL再解引用。第三个是用Codesys标准库自带的转换函数比如REAL_TO_DWORD和DWORD_TO_REAL这样的反向转换函数在某些版本里也存在DWORD_TO_REAL这种按位转换的函数。但各版本支持情况略有不一而且可读性不如联合体直观。建议项目里统一用联合体模式团队维护时都不会看错。4.2 MODBUS RTU和485通讯的数据高低位问题再来说一个几乎每个用汇川PLC的人都会碰到的问题MODBUS RTU通讯里32位数据的高低位顺序。热词里“200smart与汇川伺服485通讯程序”说的就是这个场景——第三方PLC通过485串联接汇川伺服或变频器。MODBUS RTU里面一个16位保持寄存器是最小单位要传32位数据REAL或DINT就得占两个寄存器。问题来了不同设备对“哪个寄存器是高字哪个寄存器是低字”的定义不一样。比如数据1.0的IEEE754表示是0x3F800000有的设备先发0x3F80高字再发0x0000低字这叫大端字序有的设备反过来先发0x0000再发0x3F80这叫小端字序。如果你按错顺序组装解析出来的浮点数会非常离谱比如变成3.9999998E-39这种天文数字或者干脆是0。处理办法其实很简单定义一个“字交换”功能块FUNCTION_BLOCK FB_SwapWord VAR_INPUT dwInput : DWORD; END_VAR VAR_OUTPUT dwOutput : DWORD; END_VAR VAR wHigh : WORD; wLow : WORD; END_VAR wHigh : WORD_OF_DWORD(dwInput, 0); wLow : WORD_OF_DWORD(dwInput, 1); dwOutput : DWORD_OF_WORD(wLow, 0) OR DWORD_OF_WORD(wHigh, 1);这段代码把DWORD里的高16位和低16位互换。接收方如果发现解析出来的数据不对首先尝试加一个这样的交换90%的问题都能解决。更彻底的办法是直接做字符串查看原始字节序但那需要在上位机或调试器里核查不如先在PLC里做字交换试试。另外还要注意串口参数。汇川伺服的485通讯常见配置是9600或38400波特率8数据位、1停止位、无校验或偶校验具体看驱动器面板和手册。通讯之前必须把从站地址、波特率、数据格式和PLC侧配置成完全一致否则连帧都收发不通。很多人配置好了指令却收不到响应先查串口参数而不是冲进程序里排查MODBUS帧逻辑。4.3 梯形图导出XML和其他调试辅助功能Codesys工程本身是以XML为基础存储结构的你现在用的梯形图、ST代码内部都是XML格式。如果你需要做版本对比、自动审查或者把梯形图转成文档给别人看可以直接使用Codesys的“导出”功能把POU导出成XML文件。这个XML可以很方便地被脚本或其他工具解析配合Git做版本管理时尤其好用。唯一需要提醒的是导出XML之前先编译一遍否则导出的可能是最后一次编译通过的内容而不是你最近修改后的逻辑。在线调试方面Codesys提供了非常强大的跟踪功能。右键变量选择“写入”“强制”都可以在线修改值但“强制”比“写入”更霸道强制之后PLC不再理会程序对这个变量的赋值只有取消强制才恢复。现场调试时我一般先用“写入”尝试不行再“强制”防止把设备逼到危险状态。5. EtherCAT主站配置与符号配置5.1 EtherCAT主站怎么配才算顺热词里“codesys control rte sl 如何配置ethercat主站”是一个高频问题。其实在AC700上做EtherCAT主站流程已经相当成熟你按下面步骤走基本不会出大问题第一步在设备树里右键“Device”添加“EtherCAT Master”设备。添加时注意选同步模式常见的有SM模式和DC模式。如果设备对运动控制同步要求高比如多轴联动、插补推荐选DC分布式时钟模式能保证各从站采样时序一致。第二步扫描从站。扫描前把网线接好给伺服和IO从站上电然后点击扫描按钮Codesys会自动识别总线上的从站型号并生成每个从站的描述节点。扫描成功后每个从站会带出一组寄存器映射这部分就叫“过程数据对象”或PDO映射。PDO映射决定每个周期主站和从站之间交换哪些数据是控制字、状态字、目标速度还是实际位置全在这里选。第三步对每个从站做地址分配。EtherCAT里每个从站点都有个站地址扫描出来的默认地址可能和你的设备安装位置不对应需要逐个检查、设置成实际节拍。这个地址和MODBUS从站地址不是一回事别混。第四步在程序中访问PDO数据。配置完成后你会在从站设备节点下面看到那些映射好的输入输出变量直接在PLC_PRG里引用就行。运动控制中惯用做法是往“控制字”写16#0006使能、16#000F打开运行从“状态字”里读取当前状态位。这些控制字和状态字的位定义可以在从站手册里查到用代码时最好逐个位命名成可读性好的变量不要直接写整数字面量不然一个月后你自己都看不懂。EtherCAT配置过程中最容易翻车的是ESI描述文件。某款从站设备在扫描时显示“无有效描述”那多半是少装了它的设备描述文件。汇川官网可以下载对应型号的XML文件把它导入到Codesys的“设备描述库”里重新扫描就好了。5.2 符号配置HMI和上位机访问变量的钥匙AC700在Codesys里变量默认是“私有”的外部设备不会直接看到。你要让触摸屏、上位机或者OPC UA客户端能访问PLC里面的变量必须做“符号配置”这个点很多人一开始根本不知道。在工程树的Application节点下面有个“符号配置”条目。双击打开后你可以勾选哪些POU、哪些全局变量需要公开。关键的一项叫“支持 OPC UA”勾上之后启动PLC运行时OPC UA服务端会把勾选过的变量发布出去外部设备只要知道节点地址就能读写。访问权限也可以在这里设置比如部分变量只读、部分变量允许写入避免现场误操作。实际项目里我习惯把所有HMI需要的变量集中放到一个全局变量表GVL中然后统一勾选发布。这样做的好处有两个一是符号配置界面简单清晰不会在一堆内部临时变量里翻找二是安全你不希望上位机直接操作到的内部中间变量天然就不会被发布出去。调试通信问题时的思路也由此而来如果上位机连不上PLC先ping通IP再确认上位机用的OPC UA客户端版本和PLC的OPC UA兼容性最后查符号配置里对应变量是否勾选了“可访问”。大多数连接不上都是这三步里某一步没做对。5.3 数据库类库和第三方扩展Codesys生态里有一种很有意思的能力可以加载第三方库来扩展功能。比如“mysql的alongwu第三方库(codesys)”这个热词说的是有人做了对接MySQL数据库的库PLC可以把采集到的数据直接写入数据库省掉上位机中转。基础指令阶段不要求你马上掌握这类高级玩法但建议你了解一下库管理器Library Manager的位置选中Application节点右键就可以打开库管理器加载你想用的库。写第三方库对接数据库这类功能时核心还是离不开基础的数据类型转换和组织能力。你从总线采集到的原始数据是INT、DWORD、REAL要写库之前得把它们整理成结构体再调用库函数写入。所以千万别小看基础指令它们是整个工控大楼的地基地基不稳楼上盖得再高都危险。6. 现场调试的常见问题与排查现象可能原因排查建议电脑扫不到AC700设备网卡IP不在同一网段或防火墙拦截网关改IP到192.168.1.x放行Codesys Gateway查看网关服务状态定时器不动作或时间不准PT填的时间格式错误或任务周期太小/未执行检查是否写了T#前缀确认POU挂到了任务上查看任务周期设置DWORD转REAL结果完全不对字节序/字序问题或把整数当浮点位模式解释先做字交换再确认协议方数据类型定义MODBUS RTU通讯超时波特率、数据位、校验位不一致或从站地址错误逐项核对串口参数用串口调试工具先抓包看原始帧编码器角度显示乱跳计数值溢出或分辨率参数不匹配用DINT/LREAL做中间运算确认分辨率是262144等真实值可视化旋转动画不动变量未绑定或旋转属性里中心点不对检查变量绑定设置旋转中心坐标强制变量后逻辑不恢复强制状态未取消在线菜单里“取消所有强制”或者重新登录PLC这些坑大多是我实际调试时踩过多次的。尤其“扫描不到设备”和“MODBUS数据乱码”这两类占了我过去一年现场问题的一半。养成一个习惯改完程序先编译再下载下载完先复位冷启动启动后再看在线监控值。这一套流程能规避很多诡异问题。关于在线监控我再啰嗦一句。Codesys里的“登录”不等于“下载”。登录只是连接PLC并查看当前运行状态下载才是把新程序写入PLC。如果只是改了程序还没下载点击登录后你会发现画面还是PLC里跑的老程序并不是你刚改的新逻辑这是很多新人的认知盲区。还有一个小技巧在线监控时如果你只想看某几个关键变量的实时值不要在一堆代码里翻直接在视图菜单里打开“监视表达式”把变量拖进去相比在代码行里逐个看效率高得多。现场被催着交活的时候这个功能能让你保持清醒。另外程序注释这个东西平时看着没什么用等三个月后原设备出问题你被叫过去维护时就会感谢当初写注释的自己。Codesys里注释在行首用//块注释用(* *)梯形图里也可以给线圈和触头加上注释文字。我见过太多“没有一行注释的程序”简直就是现场维护的噩梦。关于代码规范也提一个我自己的习惯定时器和计数器功能块命名时带上工位或设备名比如TON_SpindleCooling、CTU_PartCount不要用Ton0、Ton1、Ctu0这种名字。变量的命名也是一样启动按钮叫bStartButton停止按钮叫bStopButton一眼就知道是什么。群里的新手老爱问“为什么我的程序跑起来和想的不一样”我看过他们的源码一半以上问题出在变量名毫无语义自己都分不清该用哪个。最后再说一点心得AC700这个平台虽然是Codesys内核但它和欧系PLC还有些细微差异汇川在底层驱动和某些功能块上做了本地化封装。遇到问题不要只搜英文资料去汇川官网的下载中心找对应手册、应用笔记上面有很多针对性和本地化优化的内容比网上到处拼凑的结论靠谱得多。工控这行最快的成长路径从来不是你google能力多强而是你能不能把每个报错、每个异常都当成一次学习机会慢慢构建出自己的排查工具箱。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。