ARTICLE DETAIL

资讯详情

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

CODESYS V3.5入门指南:从环境搭建到数据采集的完整实践笔记

CODESYS V3.5入门指南:从环境搭建到数据采集的完整实践笔记 你有没有过这种经历现场三台设备一台用三菱一台用西门子还有一台国产机器打开程序一看软件又是一个新的。这几年我最大的感受是PLC开发的“语言分裂”正在被CODESYS一点点治疗。所谓CODESYS简单说就是一套符合IEC 61131-3标准的PLC软件开发平台它既能运行在PC上做软PLC也能作为内核嵌进很多硬件PLC里。对电气工程师来说学会CODESYS V3.5基本就等于摸到了一大类控制器和软件生态的共同入口。这篇笔记是我自己从零开始的实际学习记录不照着官方手册念专门讲哪些地方容易卡住、哪些坑我替你踩过适合刚准备入门CODESYS、或者已经装好软件但不知道从哪下手的同行。为什么说它值得学你会发现很多国产品牌的中型PLC底层就是CODESYS V3.5内核你前面学的东西换个品牌IDE照样能用这种“一次学习多处复用”的性价比在传统日系PLC上是体验不到的。1. 先弄清楚CODESYS到底是个什么东西1.1 它不是PLC它是PLC的“操作系统”CODESYS是德国3S公司开发的软件系统全称是Controller Development System现在最普及的是V3.5这个架构分支。你把它理解成PLC领域的“操作系统”就比较准确了。它本身不生产硬件而是提供一套完整的开发环境和运行时内核。工控机装上它的Runtime就能变成一台软PLCPLC厂商买下授权把Runtime嵌进自家硬件工程师就能用同一套CODESYS IDE去写程序。V3.5这个版本号容易被新手误解成“软件版本3.5”其实它指的是CODESYS V3这个内部的整体架构V3.5是这套架构发展至今的版本线名称后面还会继续迭代小版本比如V3.5 SP19、SP20之类。你在官网下载开发环境时看到的是CODESYS V3.5 SP几这个SP补丁包级别越高功能越全对老版本工程的兼容也做得不错。CODESYS能干什么一套环境里面你可以写PLC逻辑、做可视化HMI、配EtherCAT总线、组运动控制轴、开OPC UA服务器、接数据库、跑CIFX网关应用。对一般电气工程师来说最常用的还是写逻辑、做仿真、完成设备数据采集这三件事它都做得非常顺手。它的开放性也是它火起来的关键原因。传统PLC厂商的编程环境往往只服务自家硬件而CODESYS生态里有大量设备厂商的Target包装上汇川的包就能连汇川PLC装上某个国产小厂家的包就能连那个牌子的PLC甚至同一个项目里你可以无缝换一个目标平台重新编译。所以你在设备现场看到某个国产PLC编程软件界面跟CODESYS长得一模一样时不用惊讶它不是“侵权仿冒”而是真的内嵌了CODESYS Runtime。这个现象在近几年的国产PLC市场里非常普遍也是我推荐电气工程师认真学它的最大理由。1.2 为什么说电气工程师值得花时间学它从个人职业角度看学CODESYS能明显降低反复学习不同品牌软件的精力消耗。我见过不少工程师会三菱又会西门子工具书堆一柜子但碰到一个新品牌还是得翻手册。CODESYS不一样你只要把一套工具链磨熟很多品牌PLC都能直接上手比如汇川的中型机、信捷的部分系列、还有一些做控制器模块的设备商本质都在CODESYS体系里。再把视野拉高一点TwinCAT 3也就是倍福现在的核心开发环境它底层同样是基于CODESYS V3架构演化出来的。虽然倍福做了大量改动和封装界面也完全不一样了但你如果已经具备CODESYS的任务调度、POU组织、符号配置这些基本概念再去学TwinCAT认知成本会低一个量级。从技术属性上看CODESYS比传统PLC开发更接近软件开发。它有完整的任务配置、库管理器、断点调试、在线修改、版本管理工具链。你写的不是一个“梯形图文件”而是一个工程一个可以复用、可以封装、可以通过库文件分发的软件项目。这种工作方式带来的效率提升是长期写“单机逻辑”时感受不到的。当然了要说缺点也有。CODESYS自由度太高要求工程师自己有一定的软件工程素养任务和库的概念对于只看过梯形图的老师傅来说初期确实要适应一阵。但你只要把前面几章看完自己动手跑通一个仿真工程这层窗户纸很快就破了。2. 环境搭建与第一个工程2.1 下载、安装和许可证半小时解决的几件事先解决软件从哪来。CODESYS官方下载入口是它的官网和CODESYS Store开发环境本体通常叫CODESYS Development System V3.5。官网下载需要注册账号注册是免费的下载也是免费的。我不建议去找什么绿化版、老版本绿色版官方版本带自动更新库文件全出问题也好查。安装时有几个小细节安装路径别带中文别放在有空格的长目录下CODESYS的编译器在个别中文路径工程下会报一些莫名其妙的路径错误安装完成后第一次启动建议把整个安装目录和工程目录加入杀毒软件白名单尤其是使用USB加密狗和仿真器的时候杀毒软件误杀组件的情况我碰到过不止一次如果你要用某个具体品牌的PLC还需要去该品牌官网下载对应Target包和Device Description设备描述文件装好后才能在设备类型列表里看到那个型号只在电脑上学习没有真机就选CODESYS Control Win V3这是官方提供的本机仿真运行时。许可证是新手最容易懵的地方。CODESYS开发系统本体是免费可用的本机仿真也默认能用。但某些专业组件、高级库、特定设备通讯协议会提示需要许可证常见的像CodeMeter授权、软授权文件、试用授权。遇到弹窗写“Licence required”先别慌多数情况是你用了一个需要专业授权的组件切回最基本的工程和标准库或者换成官方仿真器就能正常跑。我自己的习惯是新建虚拟机专门用来装不同版本的CODESYS开发环境避免多个SP版本互相覆盖导致库冲突。如果你只是验证性学习一台Windows 10 64位电脑直接装也完全没有问题。2.2 新建工程用ST点亮第一个输出第一次新建工程的操作流程我建议严格按下面几步走走通一次比看十遍教程都有效打开CODESYS点击File - New Project选择Standard Project填写工程名称和保存路径选择设备本机仿真选CODESYS Control Win V3连真机则选对应的厂商PLC型号选择POU语言推荐选ST结构化文本后面看别人的程序也最通用点击OK系统会生成一个带PLC_PRG的默认工程结构。在PLC_PRG里写第一段“点亮输出”的逻辑。这段程序的作用是把一个布尔输入直接复制给一个布尔输出相当于传统PLC里的X0传到Y0VAR xStart : BOOL; xOutput : BOOL; END_VAR xOutput : xStart;然后打开左侧设备树的PLC_PRG在下方变量表里右键把xStart和xOutput的属性改成“显示在IO映射中”再把它们拖到设备树底部的IO映射界面去绑定具体的物理输入输出点。仿真环境下没有实际IO可以直接在线写入变量看到效果。点击菜单栏的“登录”按钮首次登录会提示是否下载初始工程点确认。注意如果你没有提前启动仿真运行时登录时它会提示找不到设备。解决办法是在设备树里双击CODESYS Control Win V3在打开的设备列表中检查是否已经启动或者右键设备节点选择“启动”选项。下载完成后点击“运行”程序就跑起来了。这时候你在在线监视模式下右键变量xStart选择“写入”把它写为TRUE会看到xOutput也跟着变为TRUE。这一步虽然简单但它把工程创建、设备选择、变量映射、在线下载、运行监视这一整条链路全部打通了。我强烈建议你在这个环节不要跳过任何一步尤其是设备选择和在线下载这是后续一切操作的地基。我第一次做时直接选错了设备类型结果下载时一直提示设备不匹配折腾了大半个小时才意识到是Target包的问题。3. 理解任务、POU与库才算真正入门3.1 POU三兄弟PRG、FB和FUN的区别CODESYS里程序的基本组织单元叫POU中文里通常叫程序组织单元。新手最容易混淆的是三类POU的用法PRG、FB、FUN。PRGProgram它是程序入口由任务决定什么时候被调用。一个工程里可以有多个PRG只要在任务配置里把它挂上去它就会被周期执行。PRG适合放顶层逻辑比如整机的状态机、主流程调度。FBFunction Block功能块它是带记忆、带内部状态的。同样一个FB被调用两次两个实例的内部变量互不干扰。典型例子是TON定时器你放两个TON实例一个管启动延时一个管停止延时两个计时互不影响。自己写电机控制、温度PID、报警逻辑时把它封装成FB是最合理的。FUNFunction函数它是无状态的纯计算。输入相同输出就一定相同内部不能保存状态。比如数学函数ABS、SIN就是我们说的FUN。自己写一个摄氏转华氏的换算函数就很适合用FUN。新手常见的错误是想用一个FB结果在声明区直接写TON(IN : ...)编译器立刻报错。正确做法是先实例化再调用比如VAR tonDelay : TON; END_VAR tonDelay(IN : xStart, PT : T#5S); IF tonDelay.Q THEN xOutput : TRUE; END_IF这就是FB和FUN最直观的区别FB要先new一个实例FUN直接调就可以。把这个关系理顺后面看系统库、看别人封装的功能块都会轻松不少。3.2 任务配置控制周期和优先级不是随便填的CODESYS里的任务Task是定时调度POU执行的机制。默认工程会生成一个MainTask周期通常是20ms或50ms。你把POU挂到任务上它就会按你设定的周期被循环调用。任务配置里有两个东西我建议新手一开始就养成好习惯周期和优先级。周期决定了程序多久执行一次。做布尔逻辑、模拟量处理、普通设备控制20ms到50ms完全够用做运动控制轴循环一般放到1ms到4msHMI刷新、数据采集上传放到100ms到500ms也合理。不要所有程序都塞到同一个快速任务里那样只会白白消耗CPU。优先级决定任务之间的抢占关系。CODESYS中优先级数字越小优先级越高高优先级任务会打断低优先级任务。设计多任务时要特别注意全局变量在不同任务之间并行访问的问题。一个低优先级任务正在读取某个全局数组高优先级任务突然修改了这个数组会导致数据不一致。解决思路无非两种用系统自带临界区保护机制或者把交互变量在任务开头复制到本地缓存。仿真器里跑多任务并不一定能真实反映硬件的时序表现。仿真环境的定时精度依赖于操作系统调度真的用PLC运行时任务周期才是硬件级的。这点在后期做运动控制时尤其明显仿真器里看不出来的抖动真机上可能直接造成轴抖动报警。3.3 自己封装库文件从面对代码到面向接口学会把常用的POU打包成库文件是CODESYS进阶的一道分水岭。我第一次听到“CODESYS如何生成库文件”这个问题时也愣了一下后来实际操作一遍之后发现过程其实非常直接。先说一下思路传统PLC里你想在一个新项目里复用旧项目的程序最常见的办法是复制粘贴但粘贴多了很容易带进来一堆无关变量和隐式依赖。CODESYS的库机制解决的就是这个问题它让你把功能块、函数、全局变量统一编译成库文件别人或新项目只需要安装这一个文件就能使用里面全部功能。操作步骤大概是这样的在CODESYS开发环境中新建一个Library工程也就是库工程在库工程里添加需要复用的POU比如一个电机控制FB、一个CRC校验函数、一个报警分组处理FB填写项目信息包括库名称、版本号、公司名、作者编译库工程编译完成后在输出路径下生成一个.library文件打开目标应用工程在库管理器左下角点击“安装库”选择刚才生成的.library安装完成后库管理器里就能看到这个库程序里也能直接调用了。这里面有几个容易踩的点。库工程里不要写死具体硬件的IO地址否则库移植到别的设备上就废了要把IO访问放到调用侧通过变量传递进去。库内部POU命名要加前缀比如厂家名或项目名否则很容易和系统库里的同名功能块冲突。每次修改库源码后记得提升版本号再编译不然目标工程里的库不会自动更新。封装库的收益是长期的。我自己把常见的设备控制逻辑、数据校验算法、故障报警处理沉淀成标准库之后新项目开发周期明显缩短而且调试阶段碰到的问题也少了因为库内部逻辑已经经过多轮项目验证。4. 数据采集与对外通信符号配置、plc-recorder与数据库4.1 符号配置外部程序读不到变量时的第一查看点很多人在把CODESYS的数据对外共享时都会卡在一个莫名其妙的问题上程序编译正常、在线监视正常、上位机就是读不到变量。这里绕不开的就是符号配置。CODESYS的工程变量默认对外部工具是不可见的你必须手动告诉它“这个变量可以对外开放允许外部程序通过某种协议读取”。路径很简单在Application节点上右键找到“符号配置”选项。打开配置窗口后你可以勾选需要导出的POU和全局变量同时选择对外服务方式比如OPC UA、Modbus TCP、自定义符号文件等。只勾选还不够。我实战中碰到过的坑是勾选完成了上位机依然读不到。排查半天发现设备树里Application节点下的“下载选项”没有勾选“下载时生成符号文件”或者生成的符号文件路径和外部工具读取的路径不一致导致对方拿到一个旧文件。还有一点容易被忽略单个变量的“可见性”属性也会影响符号导出。右键某个变量在属性页里可以看到它的访问修饰符如果设成了“私有”或“仅内部”即使你去符号配置里勾了POU外部工具也可能看不到它。想对外读就把变量属性设为“调用者可见”、“对外可见”这一类。我的建议是任何需要上位机、数据库、第三方向量软件采集的数据都尽量集中在几个专门做通信的全局变量结构体里而不是满工程零散布变量。这样符号配置看一眼就清楚外部工具配置也简单排查问题也快。4.2 plc-recorder采集CODESYS变量的前提与实战PLC-Recorder是目前不少同行在做数据记录时喜欢用的第三方采集软件它可以把PLC变量按设定周期采集下来写入CSV或数据库配置比传统组态软件轻很多。很多人刚拿到手时不知道怎么和CODESYS对接其实核心就一句话让plc-recorder拿到CODESYS的符号文件。第一步在CODESYS的符号配置里把变量对应的XML符号文件导出或生成出来。不同版本的CODESYS导出格式可能略有差异但我建议优先用“用户自定义XML”这个选项兼容性更好。第二步在plc-recorder的配置界面里添加一个新的连接数据源选择对应的CODESYS驱动。如果你不确定用哪个先试“CODESYS XAE/符号访问”这一类指向刚才导出的XML文件。软件会自动读取变量列表你在里面勾选要采集的变量设置采集周期即可。第三步把配置下载到CODESYS PLC确保符号配置生效。注意如果PLC处于停止状态或者工程没有被在线下载符号文件就不会被运行时加载plc-recorder那边自然是一片空白。躬身入局之后你会发现plc-recorder看不到变量时90%的问题都在符号文件没生成、路径不对、工程没重新激活这三点上。剩下的10%才是通讯协议问题比如PLC的OPC UA服务没启动、防火墙拦了端口。还要啰嗦一句第三方采集软件的采样周期不要小于PLC任务周期否则采集到的是重复数据没有任何意义还白白占用网络资源。一般设置成PLC任务周期的3到5倍以上比较合理。4.3 数据库对接官方库、第三方MySQL库与实时约束关于CODESYS连数据库很多人的第一反应是“PLC还需要连数据库”但等你做设备联网改造、做工艺数据追溯的时候就知道这个需求有多普遍。CODESYS本身并不是完全没有数据库能力只是官方默认不随开发环境一起安装数据库类库需要自己去库商店里找或者用第三方的库。先说明一条我在项目中反复撞墙后总结出的铁律绝不要把数据库操作放进高优先级控制任务里。数据库连接、INSERT、查询尤其是首次建立连接耗时可能达到几百毫秒甚至更久你把这段代码放进10ms的任务里一个周期没执行完下个周期又来了轻则程序卡顿重则看门狗超时直接停机。正确做法是把数据库操作放到一个独立的慢速任务里周期500ms到1s数据先用环形队列缓存再批量入库。数据库相关的库有几种常见选择。第一种是官方提供的数据库类库走ODBC桥接先配置ODBC数据源再在CODESYS里调用库函数。这种方法的好处是兼容多个数据库坏处是ODBC依赖Windows环境在纯Linux Runtime上不好使。第二种是社区/第三方写的MySQL原生协议库比如网上搜“alongwu”能找到作者发布的一个MySQL第三方库CODESYS它直接封装了MySQL通信协议不依赖ODBC典型用法是先建立连接对象再执行SQL。下面给出一个沿类似思路的MySQL第三方库的调用示意库API不同但基本调用模式差别不大VAR dbConn : MYSQL.Connection; dbQuery : MYSQL.Query; iAffect : DINT; END_VAR dbConn.Host : 192.168.1.20; dbConn.Port : 3306; dbConn.User : plc; dbConn.Password : password; dbConn.Database : factory; dbConn.Open(); IF dbConn.IsConnected() THEN dbQuery.Connection : dbConn; dbQuery.Sql : INSERT INTO run_log(ts, val) VALUES(NOW(), 123); dbQuery.Execute(); iAffect : dbQuery.AffectedRows(); END_IF这段逻辑不复杂但结合我的实际经验必须提醒几个点。程序里字符串变量如果带单引号直接拼到SQL里会把语句截断INSERT报错所以涉及字符串入库前一定要做转义和长度限制。数据量大的时候不建议每周期单条INSERT而应该攒一批后批量插入明显更快也减少对PLC的影响。第三方库的授权问题也要自己确认个人学习和验证通常没问题但商用项目里最好明确授权条款或者换用官方库、用中间的采集软件转发避免给自己挖坑。4.4 汇川等国产PLC的CODESYS生态聊到CODESYS生态就绕不开汇川。汇川的中型PLC比如AM系列编程软件InoProShop底层就是CODESYS V3.5内核。你提前在通用CODESYS里练熟的手感到了InoProShop里会发现大部分能直接迁移。这也是我前面强烈建议学CODESYS的原因之一它确实能减少你在多个品牌软件之间的重复学习。不过通用CODESYS和厂商定制IDE之间还是有一些差异要心里有数。厂商会在内核上套一层自己的设备配置界面IO映射、总线配置的位置可能不同运动控制库、视觉库也常常被厂商二次封装成自己的命名空间厂商自带的库可能跟通用库不兼容乱装通用库会有风险。最稳妥的学习路径是先在通用CODESYS环境里把ST编程、任务配置、库管理、符号配置这些软技能打牢再下载对应厂商的免费编程软件连真机调试。这样两边不会打架也更容易看出厂商到底改了哪些东西。我用汇川设备时还碰到一个习惯问题它们有些型号不支持在线修改即使只改一个变量类型也可能要求全量停机下载。如果你习惯了西门子那种在线修改的灵活性刚开始会很不适应。这也提醒我们前期把通信变量和地址规划详细了能少很多停机修改的麻烦。5. 调试与排查这些坑我替你踩过了5.1 下载后PLC不运行的原因第一次登录CODESYS控制器的流程是点击登录 - 提示下载工程 - 确认下载 - 再点运行。很多新手习惯点完登录就直接运行结果提示“没有活动应用”这其实是因为还没下载。CODESYS里下载和运行是两个独立动作下载是把编译后的应用装载进设备运行是让控制器开始执行。还有一个容易忽略的是Boot Project也就是开机自启工程。你下载完工程后如果不上传到Boot区控制器断电重启后就不会自动运行程序设备现场断电再来电机器傻在那里非常尴尬。在Application节点上右键把当前应用设置为Boot Application能解决这个问题。在线修改是另一个常见坑。CODESYS支持在线修改但如果你改了变量声明结构加了新POU或者改了任务配置在线修改就会失败提示需要停机下载。这时候别硬点老老实实全量下载。特别是生产设备在跑你手一抖就停机了操作前一定跟现场确认状态。5.2 仿真正常、真机报错的排查顺序仿真跑得好好的一上真机就各种幺蛾子这是CODESYS新手必经阶段。排查的时候别慌按顺序来。先看设备树有没有红色报错节点。PLC日志里一般会给出错误码和错误描述比如EtherCAT从站丢失、某个IO模块故障。设备树的报错是最直接的入口比你去猜程序快得多。再看总线IO状态。EtherCAT主站扫描不到从站先查从站是否上电、站号是否冲突、网线是否接好、终端电阻是否匹配。模拟量模块读数异常看一下模块配置的通道类型、量程、溢出位是不是被置位了。然后才轮到程序。用在线监视看输入条件、输出状态、中间变量重点排查是不是仿真里依赖了本机时间、文件路径等环境相关的东西。最后还有一些玄学问题真机跑得比仿真快或慢导致时序差异。仿真用的是Windows线程调度跟硬件的确定性执行不一样你在仿真里把时间参数调得刚好真机可能偏差很大需要用Trace记录实际周期来校准。5.3 在线调试三板斧监视、强制、TraceCODESYS的在线调试工具用熟之后比传统PLC方便不少。监视窗口是默认的在线表格程序运行时你可以看到所有变量实时值还可以自己添加感兴趣变量到Watch窗口集中观察。强制和写入的区别要分清。强制Force会持续把变量锁定在某个值哪怕程序运行到下一周期它也一直被“钉”在那个值上适合模拟输入信号、测试分支逻辑。写入Write是一次性写值下个周期程序正常执行适合手动修改参数、给某个输出临时置位。调试完一定记得取消所有强制不然可能导致现场事故我见过有人强制了一个安全信号忘记取消设备差点出事。Trace功能相当于PLC内部的简易示波器。你可以在线配置要记录的环境变量、采样周期、触发条件让它记录一段数据用来分析变量变化曲线。调PID、看轴速度波动、查通信数据抖动都很依赖Trace建议早点熟悉。个人的小习惯是在程序里预留一个重要中间变量区调试时把它们全部暴露到符号配置里这样既方便Trace也方便上位机诊断数据一举两得。5.4 常见问题速查表下面这个表是我在实际学习和项目中经常用到的排障清单一条条对着查能省很多时间。问题现象常见原因解决思路下载提示“工程与设备不匹配”Target包版本或设备描述不对更换匹配的设备描述文件升级Target包仿真登录失败找不到设备未启动CODESYS Control Win运行时在设备树双击设备启动对应仿真运行时外部工具读不到变量符号配置未导出、未激活或变量可见性不对重新生成符号并在线下载检查变量属性程序编译正常但不执行POU没挂到任务上或任务周期为0在任务配置里添加POU设置合理周期在线修改时报错要求停机变量声明或任务结构发生变化改为全量下载提前规划好变量结构数据库写入导致程序卡顿数据库操作放进了控制任务单独慢速任务队列缓存批量入库库安装后找不到功能块库版本与当前工程不兼容检查库依赖重新安装匹配版本库变量值变化但组态软件不刷新符号没有重新发布、服务未启动重新下载激活工程启动对应通信服务这个表不是标准答案每个项目环境不同照样会有各种不适用的情况但排查顺序本身值得参考先设备、再总线、再程序、再通信。最后说两点个人体会CODESYS这套系统真正拉开使用效率差距的不是指令记了多少而是任务怎么组织、库怎么封装、数据怎么对外流动。我自己的习惯是拿到一个新控制器先花半天走一遍环境搭建、点灯、仿真、符号导出这个完整链路再开始写业务逻辑。这套基础链路熟练之后后面接触什么内核是CODESYS的设备都会很从容。再分享一个细节保持官方开发环境的版本尽量新但工程文件尽量在主力稳定版本上维护。CODESYS的旧工程被新版本打开后如果不是需要用到新功能不要轻易乱升级组件和库避免整个工程被“顺便”改到无法回退的版本状态。装一个虚拟机专门做版本兼容性验证是我这几年的常规操作了。
返回列表