前阵子给客户做了一套小型自动检测设备主站选了基恩士KV8000现场几个工位的输入点通过XH16EC总线从站远程扩展整个控制程序没有用梯形图全部用ST结构化文本写完。项目不算复杂但把总线组态、状态机逻辑、报警记录、IO映射这些自动化项目里的常见需求都串了起来做完之后我自己复盘了一遍觉得这套KV8000 XH16EC 全ST的方案在中小型设备上很有参考价值所以把整个思路和实操过程整理出来分享。这套东西适合谁看如果你正在用基恩士PLC做项目或者正纠结到底要不要用ST语言写整套程序、总线远程IO和本地扩展怎么选这篇文章可以直接当参考。我会把选型逻辑、硬件组态、程序框架、实操步骤、踩坑记录都写到尽量把为什么这么做讲透方便你照着改到自己项目里。1. 项目背景与方案选型为什么是KV8000 XH16EC1.1 需求场景还原分散点位带来的布线难题这个设备的结构不复杂但有个很头疼的问题输入点特别分散。主电控柜在设备的一端而另外三个工位分布在设备的前、中、后位置每个工位都有十几个传感器和按钮信号。如果全部走本地扩展模块一来电缆要从设备各个角落汇总到电控柜布线长度成倍增加二来后期如果客户要求增加点位本地扩展模块插槽很快就满了改起来非常麻烦。当时摆在面前的有两套路线路线一本地扩展IO。在KV8000旁边挂一串I/O模块成本确实最低但布线压力和后期扩展性都差。路线二总线远程IO。通过EtherCAT把XH16EC这样的远程从站模块直接放到工位旁边现场传感器就近接入总线电缆一根网线拉过去就行。我选了路线二。对比一下就很清楚本地扩展把传感器线缆全部集中到电控柜总线扩展只是把总线网线拉过去传感器电缆大幅缩短施工量小、故障点少、排查也方便。这种场景下总线方案省下来的电缆成本和施工工时其实比模块本身的差价要多得多。1.2 主站与从站选型KV8000和XH16EC各自的价值主站选KV8000看中的是它几个实打实的能力。一是扫描周期快KV8000的基础扫描时间可以做到很短对于需要快速响应的检测设备很重要二是自带EtherCAT主站能力不需要额外加通讯模块直接就能挂从站三是程序容量和指令丰富度足够ST、梯形图、结构化文本都能混用程序写复杂了也不至于捉襟见肘。从站选XH16EC因为它是16点输入的总线从站模块正好匹配工位上的传感器信号数量而且支持EtherCAT协议直接挂在KV8000下面即可。这模块的接线非常简单输入侧接传感器总线侧接网线模块体积也小放在工位附近的现场接线盒里很合适。注意XH16EC型号中的16代表输入点数如果现场输出点也需要远程扩展同样的思路可以选对应的输出型远端模块按实际点位需求配置即可。这里要多说一句选型时的整体考量EtherCAT本身是一种非常成熟的总线协议主站周期性给从站发数据帧从站在一个通讯周期内把输入数据返回。它的特点就是延迟低、同步性好、拓扑灵活非常适合这种PLC主站 分散IO从站 伺服的设备架构。硬件上怎么搭直接决定了后期程序好不好写、现场好不好维护。1.3 全ST程序为什么放弃梯形图聊程序之前先交代一句背景基恩士的编程软件KV STUDIO是支持梯形图LD、ST、结构化梯形图FBD等多种编程语言的。大部分做日系PLC的人习惯用梯形图我这次却特意全部用ST写主要原因有三个第一项目逻辑有大量非顺序型分支。设备有多个工位并行动作还有自动、手动、回原点、报警暂停这些模式切换这类逻辑如果用梯形图写很容易变成一大片让人看不懂的意大利面条。用ST的CASE语句去做状态机结构清晰太多。第二有批量数据处理需求。报警记录、数据统计、配方管理都需要操作数组和循环这种功能在梯形图里写起来非常痛苦用ST的一个FOR循环就能处理完。第三程序可复用性高。ST支持功能块FB和功能FC把急停逻辑、伺服定位、气缸动作这些标准逻辑封装成功能块后换一个项目改改参数就能用。当然全ST也不是没有代价。最直观的问题是调试的时候不如梯形图直观——梯形图能看到线圈和触点的通断状态ST只能看变量值。后面我会专门讲对应的调试技巧这里就不展开了。2. 系统架构与总线组态硬件怎么搭才稳2.1 系统拓扑与IO分配先把点位表做明白整个系统的架构可以这样理解KV8000是核心负责程序运算、EtherCAT主站管理、与上位机通讯XH16EC作为EtherCAT从站模块放在三个工位附近把传感器信号集中接入另外还有一台小功率伺服通过EtherCAT挂在同一总线上实现精确定位动作。三台XH16EC从站加一台伺服驱动器挂在同一条EtherCAT总线上。总线上从站的具体排列顺序可以在软件里组态只要实际接线顺序和组态一致就行。动手写程序之前我习惯先把IO分配表做清楚。这一步看着基础但很多项目后期乱就乱在点位表不清不楚。XH16EC每个模块有16个输入点按站号-通道号的方式统一编址比如第1台XH16EC的输入点就命名为IN_1_01到IN_1_16。我整理了一张表从站位置输入点地址信号含义备注工位1 / XH16EC #11.01~1.04启动、急停、复位、暂停面板按钮工位1 / XH16EC #11.05~1.10工位1传感器信号真空、夹紧、到位等工位2 / XH16EC #22.01~2.08工位2传感器信号检测、定位等工位3 / XH16EC #33.01~3.08工位3传感器信号计数、限位等这张表不只是给程序用也是给现场电气人员接线的依据。我建议所有项目都保持这个习惯程序里的IO别名和图纸上的线号、端子号一一对应后面调试和维修都能省大事。2.2 EtherCAT组态与从站地址设置细节决定成败在KV STUDIO里组态EtherCAT核心就三步创建主站、扫描从站、映射IO。第一步新建工程时选择KV8000这个CPU型号然后在系统配置里添加EtherCAT主站。多数情况下软件会自动识别出主站不需要额外设置通讯参数但需要确认一下通讯周期。我这次把EtherCAT的通讯周期设置成1ms也就是主站每1毫秒刷新一次总线数据。这个周期对于设备上的传感器信号和伺服控制都足够了。第二步挂从站。KV STUDIO提供从站扫描功能可以在软件里直接搜索总线上实际连接的从站设备。扫描到之后把XH16EC模块一一添加到组态树里注意从站的顺序一定要和实际物理接线顺序一致否则程序里的地址就和实际信号对不上了。第三步地址分配与IO映射。每个XH16EC需要分配一个站地址作为身份证。XH16EC模块本体上有地址拨码开关把站号设置成1、2、3然后在软件里也对应填入。完成之后软件的IO映射功能会自动生成每个输入点的软元件地址后面写ST程序的时候直接引用映射变量即可。注意组态完成后从站地址和IO映射表会自动生成地址变量。如果你像我一样用ST编程建议给这些映射变量重新命名成有意义的别名比如把第1台从站的1号输入点改名为IN_1_01_StartBtn而不是直接引用系统生成的软元件编号MX100之类的。这一步会大大提升程序可读性。2.3 通讯可靠性设计别忽略电源和接地总线通讯这个环节很多人只关注接线和组态却忽略了一个非常重要的影响因素——电源和接地。XH16EC尽管是总线通讯但它的传感器输入供电和模块供电都要单独做好。如果从站附近有大功率设备频繁启停电源波动可能会引起总线偶发断线。我的做法是在每个XH16EC附近使用独立的DC24V开关电源给传感器和模块供电并且电源的负极在电控柜里单点接地避免形成地环流。另外总线的末端从站一定要接好终端电阻EtherCAT的终端处理做不好会出现偶发通讯超时这种很难查的故障。这些看起来都是小事实际项目里恰恰是这些小事决定设备稳不稳定。3. 全ST程序框架设计代码怎么写才不乱3.1 程序组织结构把逻辑拆分成分层模块全ST程序最怕的就是把所有代码堆在一个大程序里。我的组织思路是分层第一层主任务。负责调用各功能块相当于总调度。第二层功能块。每个功能块负责一个独立功能比如自动流程控制、报警管理、伺服轴控制、手动操作。第三层公用函数。负责时间、数据转换、计算等基础操作供上层调用。在KV STUDIO里新建ST程序一个功能块对应一个文件功能块之间通过实例化的方式互相调用。这样的好处是每个文件几百行逻辑一目了然出问题也容易定位。举个例子报警管理这个功能块我把报警的产生、确认、记录全部封装在里面主程序只需要调用它这一个功能块报警相关的所有输出就都自动更新了。3.2 核心逻辑用ST写状态机控制自动流程设备自动运行是整个程序的核心我用一个自动流程状态机来控制。状态机用IEC 61131-3标准风格的CASE语句实现每个状态代表设备的一个工作阶段CASE autoState OF 0: // 待机 IF startSignal THEN autoState : 10; // 切入准备状态 END_IF; 10: // 准备 // 检查各工位条件是否满足 IF readyOK THEN autoState : 20; END_IF; 20: // 工位1定位 axisStart : TRUE; IF axisInPosition THEN autoState : 30; END_IF; 30: // 检测执行 // 触发传感器检测等待结果超时 measureStart : TRUE; IF measureDone THEN autoState : 40; ELSIF measureTimeout THEN alarmCode : 100; // 检测超时报警 autoState : 999; // 进入报警停止状态 END_IF; 40: // 完成 autoState : 0; 999: // 异常停止 // 输出停止等待复位 IF resetSignal THEN autoState : 0; END_IF; END_CASE;这里的关键点有两个。第一个是每个状态都要有超时保护不能让设备卡在某个状态等待传感器信号。第二个是状态的跳转条件必须依赖变量而不是直接依赖物理IO也就是把IO信号先做一次逻辑运算再作为跳转条件。这样以后改硬件接线只需要改IO映射部分不需要动状态机逻辑。3.3 急停与安全逻辑ST里同样要做硬件级保护用ST编程有一个原则必须守住安全相关的逻辑不能只放在程序里更要保证输出回路本身安全。急停按下时外部硬件回路应该直接切断危险输出这是硬件层面的保底程序里的急停逻辑则负责触发报警、暂停状态机、保持安全位置。ST里的急停逻辑我一般这样处理用一个专用的功能块SafeCtrl集中处理急停输入、复位、报警输出和状态重置。急停输入带常闭逻辑即急停按钮没有按下时该变量为TRUE程序正常运行急停按下时变量为FALSE状态机立刻停止所有输出封锁。这样即使在程序意外出错时硬件急停回路也能兜底。提示ST程序再完善也不能替代硬件的安全回路。涉及安全相关的项目必须严格按照安全标准设计硬件保护电路不要指望PLC软件来做唯一的安全保障。3.4 报警记录与批量数据处理报警记录如果用梯形图写要为一堆报警点做寄存器堆栈还是比较费劲的。ST里用一个数组加一个FOR循环就能搞定。我的做法是报警管理功能块维护一个报警记录数组每条记录包含报警代码、报警时间、确认状态。当程序检测到某个报警条件满足时调用一个添加报警记录的方法把报警代码写入数组中同时记录报警发生时的设备时间。// 报警记录添加示例 IF newAlarm AND alarmCount MAX_ALARMS THEN alarmArray[alarmCount].code : newAlarmCode; alarmArray[alarmCount].time : currentTime; alarmArray[alarmCount].status : 0; // 未确认 alarmCount : alarmCount 1; END_IF; // 上位机读取报警时遍历所有记录 FOR i : 0 TO alarmCount - 1 BY 1 DO // 将报警记录打包成字符串发送到上位机 END_FOR;这类代码在ST里非常自然。同样的逻辑如果放到梯形图里要处理数组下标、循环跳转这些可读性和维护成本都会差很多。这也是我坚持用ST的一个重要原因——程序复杂到一定程度之后ST的表达能力优势是非常明显的。4. 从零搭建的实操步骤照着做一遍就明白4.1 创建工程与从站组态KV STUDIO操作要点假设你现在打开KV STUDIO准备从零开始搭这个项目我按步骤说一下。已经熟悉的可以直接跳到下一节。第一步新建工程。软件里选择新建工程输入工程名称后在CPU型号选择界面找到KV8000系列。要特别确认CPU型号的具体型号和程序容量是否匹配KV8000下有不同规格的型号选错会导致后续组态报错。第二步添加EtherCAT主站。在系统配置里右键添加EtherCAT主站然后设置通讯周期。我建议先把通讯周期设为1ms跑起来如果程序复杂、从站数量多后期可以通过性能监视判断是否需要放宽到2ms或4ms。第三步添加从站。在EtherCAT主站下面扫描从站软件会自动识别总线上的设备。扫描结果里会列出每个从站的型号、站地址和固件版本。核对无误后逐个添加XH16EC从站模块。第四步核对IO映射。添加完成后软件会自动为每个从站分配输入映射区域。你可以在IO映射页面看到每个物理输入点对应的软元件地址。我的习惯是此时就把每个输入点重命名例如IN_1_01然后再在ST程序里引用。4.2 ST程序编写与联机下载从变量表到第一行代码工程组态完成后开始写ST程序之前先做一件事整理变量表。在KV STUDIO里全局变量可以统一声明功能块内部也有自己的局部变量。我通常把设备级变量比如IO别名、状态机当前状态、报警代码放在全局变量区把某个功能块内部使用的临时变量放在功能块局部变量区。好处是明显不同功能块之间不会互相污染变量程序整体耦合度降低。然后新建几个ST程序文件全局变量区声明完成之后开始写第一行代码。第一个功能块往往是初始化逻辑——上电时把输出复位、状态机归零、读取拨码开关状态等// 上电初始化逻辑在首次扫描时执行 IF firstScan THEN autoState : 0; axisStart : FALSE; resetAlarm(); initDone : TRUE; END_IF;写完所有ST程序后点击编译。编译通过后用以太网线连接电脑和KV8000在KV STUDIO里打开在线监视下载程序到PLC。下载完成后把PLC切换到运行模式。4.3 在线调试技巧全ST程序的监视方法很多用惯梯形图的人觉得ST程序不好调试其实掌握技巧之后效率一样高。我调试ST程序主要用三种工具变量监视表把关键变量状态机状态、IO信号、报警标志添加到监视窗口运行设备时实时观察变量变化。时序图监视KV STUDIO支持把变量变化记录成波形这在排查信号抖动、通讯丢包、时序冲突时非常好用。强制变量调试时手动把某个输入变量强制为TRUE或FALSE模拟传感器信号验证逻辑分支是否正确。我个人最依赖的是时序图监视。比如排查伺服定位完成信号和下一步动作是否有时序冲突时用波形把定位完成信号和下一步触发命令两条曲线拉到一起看冲突点一目了然。纯ST没有梯形图那种通电可视感但变量趋势和波形反而能让你更准确地定位问题。4.4 现场校验顺序建议程序下载完别急着全自动跑我的调试顺序是先手动单步空跑再手动带负载跑最后自动运行。空跑阶段验证每个气缸、伺服、传感器逻辑是否正确带负载阶段验证检测功能是否可靠自动阶段验证整个状态机的循环节拍是否顺畅。这个顺序能最大程度减少上来就自动运行结果设备撞机之类的风险。5. 常见问题与排查技巧实录5.1 总线通讯类问题从站不识别怎么办XH16EC从站最典型的问题就是主站扫描不到从站。我的排查顺序是看从站模块上的指示灯。XH16EC通电后运行指示灯应该正常亮起如果总线指示灯异常说明通讯链路有问题。检查网线。EtherCAT对线序要求较高现场接线必须用带屏蔽的工业以太网线网线两端水晶头不能松动。检查站地址拨码。从站模块上站号拨码是否和组态里设置的一致。确认终端处理。总线上最后一个从站是否正确设置了终端。确认从站供电。从站如果没有独立供电总线模块不会正常工作。这套顺序基本能覆盖绝大多数从站不识别的故障核心思想就是由近及远、由物理层到逻辑层排查。5.2 ST程序编译与运行问题类型和越界是重灾区ST编程最常见的编译问题就是类型不匹配比如把BOOL变量传给INT参数。这类问题编译时会直接报错处理起来还算简单。真正隐蔽的是运行时出现的数组越界比如报警数组只有50个元素程序却写入第51个这会导致PLC运行异常。我的方法是所有数组操作统一在访问前做边界检查尤其是在FOR循环里FOR i : 0 TO alarmCount - 1 BY 1 DO // 循环上限由计数器控制避免越界 END_FOR;另外KV STUDIO的ST编辑器对变量声明的要求比较严格建议启动时把所有变量全部声明完整不要在程序中间临时声明变量那样容易造成维护混乱。5.3 运行稳定性问题扫描周期对总线的影响项目跑了一段时间后如果发现从站输入信号偶尔丢失或响应变慢要考虑扫描周期和EtherCAT通讯周期是否匹配。KV8000的主扫描周期如果比EtherCAT通讯周期慢很多从站数据每几个扫描周期才被程序处理一次设备响应速度就会受影响。如果遇到这个问题先把KV8000的主扫描周期调到尽可能接近EtherCAT通讯周期再看设备是否恢复正常。如果程序运算量确实大就要考虑把一部分非实时的逻辑比如历史数据统计放到低优先级任务里执行把高优先级任务留给实时控制。5.4 常见问题速查表现象可能原因排查方法组态扫描不到XH16EC网线接触不良、站地址不对、供电异常检查指示、网线、拨码、电源顺序排查程序下载后从站IO无变化主站周期未配置、IO映射表未生成检查EtherCAT周期配置和映射表ST编译报类型错误变量类型不匹配看报错定位行显式转换类型自动状态机卡死某个传感器的到位信号没有满足用监视表查看状态变量和IO信号报警记录乱码数组越界覆盖相邻数据检查所有FOR循环边界总线偶发断线终端电阻未接、干扰严重检查终端和接地必要时加隔离收尾一点个人的实际体会这个项目完成之后我自己把全ST这个决定再审视了一遍结论是在逻辑复杂度足够、并行步骤多、数据处理需求强的设备上全ST非常适合但如果只是一台简单的小设备内部逻辑只有几步动作梯形图反而更快、更直观。编程语言本身没有高下之分关键看你手里的活配哪种工具。最后分享一个小习惯也是这次项目里实测很管用的一点每次写ST程序之前先花半小时把状态转移图在纸上画清楚把每个状态的条件、动作、超时策略都标出来再动手写代码。这个纸面功夫看起来耽误时间但写代码的时候思路非常明确后期排查故障也能对着图纸快速定位到底卡在哪一步。这套KV8000 XH16EC 全ST的组合我后面又用在了两个类似项目上基本都是直接复用框架改改IO映射和工艺条件就能交付。希望这篇分享对你有实际帮助。
阅读完成 · 觉得有帮助?