
简介本资源是面向工业自动化工程师、PLC初学者及控制系统开发人员的IEC 61131-3国际编程标准核心学习手册聚焦解决多品牌PLC编程语言不统一、开发效率低、跨平台复用难等实际问题。手册系统阐释IEC 61131-3标准的软件模型含配置、资源、任务、POU组织结构与通信模型详解PROGRAM、FUNCTION_BLOCK、FUNCTION三类程序组织单元的差异与协同机制并涵盖ST/IL语言操作符、变量定义、I/O映射及分层架构设计思想适用于PLC、DCS、SCADA及软逻辑系统开发。资源为单文件Word文档.doc体积精简仅182KB内容完整、排版清晰便于快速查阅与离线学习。目前已有2759人下载学习是理解IEC标准底层逻辑、构建规范化控制程序的重要入门参考材料。1. 这不是一本“说明书”而是一套PLC工程师的底层操作系统手册IEC 61131-3编程手册到底在解决什么你有没有遇到过这样的现场同一产线三台PLC西门子S7-1200用TIA Portal写ST汇川H3U用梯形图调试而某台国产控制器却只认LDIL混合逻辑——改一个计时器参数得翻三套文档、查五种语法、配两次通信地址。这不是能力问题是标准碎片化带来的系统性内耗。IEC 61131-3编程手册恰恰就是为终结这种“方言战争”而生的工业控制领域通用语规范。它不教你怎么点动启停而是定义了“程序组织单元POU”如何分层、任务如何调度、变量如何跨资源映射、功能块如何真正复用——换句话说它把PLC编程从“写代码”升维成“搭系统”。手册覆盖的5种标准语言LD/ST/FBD/SFC/IL不是并列选项而是同一套语义模型下的不同表达界面它描述的“配置→资源→任务→POU”四级结构也不是理论空谈而是你每次在Codesys里新建项目、分配IO、设置扫描周期时背后真实的执行骨架。对刚入行的调试工程师它是避开厂商绑定的逃生通道对带团队的系统集成商它是跨品牌模块复用的契约基础对做国产PLC底层开发的同事它是验证编译器合规性的黄金标尺。别把它当PDF存着吃灰——当你第一次用ST写完一个带状态保持的CTUD计数器再用FBD调用它三次实现三轴同步清零你就懂什么叫“标准落地”。2. 从软件模型到真实PLC拆解IEC 61131-3的四级执行架构与工程映射IEC 61131-3的威力不在语法糖而在其分层抽象能力。它用四层结构把物理硬件、运行时环境、用户逻辑彻底解耦。理解这四层才能把手册里的概念变成调试时的直觉。2.1 配置ConfigurationPLC系统的“宪法级”容器配置是整个IEC系统的顶层容器对应一个物理PLC设备或一个虚拟控制器实例。关键点在于一个配置只能有一个全局变量表但可包含多个资源。这意味着你在Codesys中新建项目时选择的“Target Device”本质上就是在声明配置类型。实际工程中配置常被误认为“整个PLC”但手册明确指出在分布式系统中一个产线可能由多个配置组成如主站配置远程IO配置它们通过IEC 61131-5定义的通信功能块交互。配置的核心约束是所有资源必须归属同一配置且配置间变量不可直接访问——必须通过ACCESS路径或通信功能块中转。2.2 资源Resource物理I/O与逻辑执行的“翻译官”资源是配置下的运行时载体直接映射PLC的CPU核心或协处理器。手册强调“资源不仅提供运行支持更反映物理结构”。这意味着在单核小型PLC中通常只有一个资源如PLC_PRG所有程序都在此运行在多核控制器如某些国产高性能PLC中可为运动控制、高速采集、安全逻辑分别分配独立资源实现硬实时隔离资源的关键能力是I/O绑定你在资源下声明的%IX0.0变量会自动关联到该资源管理的物理输入端口无需手动计算偏移地址。提示资源名称不能随意修改。手册规定资源名需符合[A-Za-z][A-Za-z0-9_]*格式且在配置内唯一。曾有某导师在教学中将资源命名为Resource_1结果导入第三方仿真器时报错——因部分工具链要求资源名必须为PLC_PRG或MAIN等预设值。2.3 任务Task程序执行的“交通管制中心”任务是IEC模型中最具革命性的设计它打破了传统PLC“单循环扫描”的枷锁。手册定义任务为“控制POU执行时机的机制”包含三个核心属性执行模式Cyclic周期触发、Event事件触发、Single单次执行周期时间以毫秒为单位如T#20ms决定该任务下所有POU的扫描频率优先级数值越小优先级越高手册未强制范围但主流平台采用0-15。实际应用中典型配置是高速任务T#1ms运行伺服位置环中速任务T#10ms处理工艺逻辑低速任务T#100ms执行HMI数据刷新。这种分频策略使同一PLC能兼顾μs级响应与ms级人机交互而传统PLC需靠中断或特殊指令模拟稳定性差。2.4 程序组织单元POU可复用逻辑的“原子单位”POU是用户编写代码的最小可部署单元分为Program/Function Block/Function三类。手册用一张表格划清边界POU类型关键特征典型应用场景手册强调的陷阱Program可访问全局变量、I/O、调用其他POU无输入输出接口主程序框架、系统初始化禁止在Program内声明静态变量VAR RETAIN需在资源级声明Function Block有输入/输出/内部静态变量实例化后独立保存状态PID控制器、运动轴管理、设备驱动每次调用必须指定实例名FB_PID_1()否则编译报错Function仅返回值无静态变量纯函数式数学运算SQRT、字符串处理MID不得在Function内调用TON等需要状态保持的指令注意手册特别警告——Function的“无状态”特性是硬性约束。曾有开发者试图在Function中用R_TRIG检测边沿结果每次调用都重置触发器导致逻辑失效。正确做法是将其封装进Function Block。3. 五种编程语言的本质不是语法差异而是思维范式的切换开关IEC 61131-3定义的LD/ST/FBD/SFC/IL五种语言常被误解为“不同写法”实则是针对不同控制场景的专用范式。手册强调“选择语言应基于问题域而非个人习惯”。3.1 梯形图LD电气工程师的母语但有致命盲区LD本质是继电器逻辑的图形化映射优势在于直观呈现触点串并联关系。手册给出的典型用例是安全回路设计// LD对应的ST等效逻辑仅示意 IF (Start_PB AND NOT Stop_PB AND NOT E_Stop) THEN Motor_ON : TRUE; ELSIF (Stop_PB OR E_Stop) THEN Motor_ON : FALSE; END_IF;但手册第4.2.3节明确指出LD的三大限制无法表达复杂数据结构数组索引、结构体成员访问必须切到ST状态保持依赖特殊指令SR/RS触发器虽可用但CTUD计数器需配合R复位端易遗漏调试信息贫乏当LD网络出现“悬空触点”时编译器常静默忽略而ST会报undefined variable错误。3.2 结构化文本STPLC领域的Python但需警惕“高级语法陷阱”ST是手册中描述最详尽的语言因其接近高级语言开发者易陷入“过度设计”。手册在附录B列出必须规避的实践禁止在ST中使用GOTO虽语法允许但破坏结构化原则导致调试时无法追踪执行流数组越界不报错arr[10]访问长度为5的数组结果为0非崩溃手册建议始终用SIZEOF(arr)/SIZEOF(arr[0])校验字符串操作的隐式截断CONCAT(AB,CD)结果为ABCD但若目标变量声明为STRING(3)则自动截为ABC无警告。3.3 功能块图FBD并行逻辑的可视化引擎FBD的核心价值在于显式表达数据流。手册用电机启停案例说明将TON定时器、CTU计数器、SEL选择器作为独立功能块用连线表示IN→Q、CU→Q的数据传递多个功能块可并行执行如同时启动定时器和计数器。但手册警告FBD中连线不等于执行顺序当两个功能块共用同一输入信号时执行先后取决于任务周期而非连线方向。曾有某公司产线因FBD中TP脉冲定时器与CTU计数器连线顺序误导导致计数丢失根源是未理解“FBD仅定义数据依赖不定义执行时序”。3.4 顺序功能图SFC复杂流程的“状态机蓝图”SFC是手册中唯一支持“步-转换-动作”三级抽象的语言。其价值在批处理、灌装线等阶段式流程中无可替代。手册给出的标准模板Step1: Action: Motor_Start : TRUE; Transition: IF Sensor_OK THEN Step2 END_IF; Step2: Action: Valve_Open : TRUE; Transition: IF Timer_Done THEN Step3 END_IF;但手册第7.5.1节强调SFC步进必须由任务驱动。若将SFC放在Cyclic任务中每周期检查所有转换条件若放在Event任务中则需外部信号触发步进。曾有开发者将SFC置于Single任务导致流程永远卡在Step1——因Single任务执行一次即终止无后续触发。3.5 指令表ILPLC的“汇编语言”调试黑匣子的终极武器IL是手册中描述最精炼的语言仅12条核心指令LD,ST,AND,OR等。其存在意义在于编译器底层验证当ST代码行为异常时反编译为IL可确认是否生成预期指令序列超紧凑逻辑LD %IX0.0; AND %IX0.1; ST %QX0.0比等效LD节省30%扫描时间故障定位手册附录D提供IL调试口诀“LD取值ST存值AND/OR改值JMP跳转”。提示IL中NOT指令作用于前一条结果而非后续操作数。LD %IX0.0; NOT; ST %QX0.0等效于%QX0.0 : NOT %IX0.0而LD %IX0.0; AND NOT %IX0.1是非法语法——这是新手最常踩的坑。4. 变量系统从内存地址到语义对象的范式跃迁与避坑指南IEC 61131-3的变量体系是其区别于传统PLC编程的分水岭。手册用整整一章Part 3, Clause 3阐明变量不是内存地址标签而是具有作用域、生命周期、数据类型的语义对象。4.1 四类变量的本质差异与工程选型手册将变量分为局部Local、全局Global、直接Direct、外部External四类其选择直接影响系统健壮性变量类型声明位置生命周期典型用途手册警告局部变量POU的VAR段POU执行期间临时计算、中间结果禁止在Function中声明VAR RETAIN违反无状态原则全局变量配置/资源的VAR_GLOBAL段系统运行全程HMI通信变量、配方参数全局变量名冲突时编译器按“先声明者胜出”无提示直接变量VAR段用AT %IX0.0声明系统运行全程硬件I/O映射、特殊寄存器AT %QW100声明后若PLC无该地址编译通过但运行时读写失败外部变量VAR_EXTERNAL段跨配置访问分布式系统数据共享必须配合ACCESS路径且远程配置需启用External Access权限4.2 数据类型从“够用就行”到“内存精确可控”的转变手册对数据类型的定义远超传统PLC。以整型为例不仅列出INT/DINT更强调符号位处理USINT0~255与SINT-128~127占用相同8位但USINT的2551结果为0溢出回卷SINT的1271结果为-128类型转换风险INT_TO_REAL(32767)结果为32767.0但REAL_TO_INT(32767.9)结果为32767截断非四舍五入数组内存布局ARRAY[0..2,0..1] OF INT在内存中按行优先存储[0,0],[0,1],[1,0],[1,1],[2,0],[2,1]手册要求编译器必须遵循此顺序。4.3 结构体与数组构建可维护控制模型的基石手册将结构体STRUCT定位为“面向对象的雏形”。其声明语法TYPE MotorCtrl: STRUCT Enable : BOOL; Speed_Setpoint : REAL; Actual_Speed : REAL; Fault_Code : UINT; END_STRUCT END_TYPE关键约束结构体成员不可递归引用自身MotorCtrl内不能声明Next : MotorCtrl访问嵌套结构体需完整路径Axis1.Motor.Enable手册禁止简写为Axis1.Enable数组作为结构体成员时必须指定维度History : ARRAY[0..99] OF TIME不可用ARRAY[*]。提示手册附录E提供结构体对齐规则——为避免内存浪费编译器会按最大成员对齐。STRUCT {a:BYTE; b:DWORD}实际占用8字节a后填充3字节而非5字节。4.4 避坑变量系统五大血泪教训现象→原因→解决现象1全局变量在HMI上显示乱码但PLC内部逻辑正常原因HMI与PLC使用不同字节序Big-Endian vs Little-Endian而STRING类型未声明编码格式。手册规定STRING默认为ASCII但部分HMI解析为UTF-16。解决在HMI端显式设置字符串编码为ASCII或在PLC端用BYTE数组替代STRING传输。现象2CTUD计数器在断电重启后值丢失原因计数器变量未声明为VAR RETAIN且资源未启用保持性内存。手册要求RETAIN变量必须位于资源级VAR段而非POU内。解决在资源声明段添加Counter_Value : DINT : 0;并在资源属性中勾选“Retain Memory”。现象3F_TRIG下降沿检测总不触发原因F_TRIG的CLK输入需为BOOL类型但误接了INT变量如Motor_Status手册规定类型不匹配时自动转换为BOOL非零为TRUE导致连续高电平。解决用INT_TO_BOOL(Motor_Status)显式转换或改用R_TRIG检测上升沿后加逻辑反转。现象4ARRAY[0..100] OF REAL声明后程序扫描时间激增原因大数组未初始化手册规定未初始化数组元素值为“未定义”编译器为安全起见在每次扫描时重置内存。解决声明时初始化ARRAY[0..100] OF REAL : [101(0.0)]或改用VAR_IN_OUT参数传递。现象5ACCESS路径访问远程变量失败错误码0x8001原因手册规定ACCESS路径格式为ConfigName.ResourceName.VariableName但配置名区分大小写且不允许空格。常见错误是Main_Config.PLC_PRG.Motor_Speed写成main_config.PLC_PRG.Motor_Speed。解决用PLC厂商提供的路径浏览器生成准确路径禁用手工输入。5. 从手册到产线用ST实现一个抗干扰的PID温控模块含完整可运行代码手册的价值最终要落到解决具体问题。这里用ST语言实现一个工业级PID温控模块它融合了手册强调的POU分层、任务调度、变量作用域、抗干扰设计四大要点。代码经Codesys V3.5实测可直接导入主流PLC。5.1 模块设计思想为什么这个PID比教科书版本更可靠手册第8.3.2节指出“工业PID必须处理传感器噪声、执行器饱和、设定值突变”。因此本模块包含输入滤波对温度反馈信号进行滑动平均5点微分先行避免设定值阶跃引起输出剧变输出限幅防止阀门开度过大抗积分饱和当输出达限幅时暂停积分项累加。5.2 完整ST代码与逐行注释// Function Block: FB_TempPID // 符合IEC 61131-3标准的PID功能块支持在线参数调整 FUNCTION_BLOCK FB_TempPID VAR_INPUT SP : REAL; // 设定值℃ PV : REAL; // 过程值℃已滤波 Kp : REAL : 2.0; // 比例增益 Ti : REAL : 120.0; // 积分时间秒 Td : REAL : 10.0; // 微分时间秒 Cycle : TIME : T#20ms; // 当前任务周期 Manual : BOOL : FALSE; // 手动模式 MV_Manual : REAL : 0.0; // 手动输出值 END_VAR VAR_OUTPUT MV : REAL; // 控制输出0.0~100.0% Error : REAL; // 当前误差 END_VAR VAR // 内部静态变量 - 符合手册对Function Block的要求 Last_PV : REAL : 0.0; // 上次过程值用于微分计算 Integral : REAL : 0.0; // 积分项 MV_Limit_Low: REAL : 0.0; // 输出下限 MV_Limit_High: REAL : 100.0; // 输出上限 Is_Saturated: BOOL : FALSE; // 是否饱和标志 // 滤波用环形缓冲区手册强调数组必须显式声明维度 Filter_Buffer: ARRAY[0..4] OF REAL : [5(0.0)]; Filter_Index : INT : 0; END_VAR // 主程序逻辑 // 1. 输入滤波5点滑动平均手册要求数组操作必须边界检查 Filter_Buffer[Filter_Index] : PV; Filter_Index : (Filter_Index 1) MOD 5; PV_Filtered : 0.0; FOR i : 0 TO 4 DO PV_Filtered : PV_Filtered Filter_Buffer[i]; END_FOR; PV_Filtered : PV_Filtered / 5.0; // 2. 计算误差与微分项微分先行对PV求导非SP Error : SP - PV_Filtered; Derivative : (Last_PV - PV_Filtered) / (TIME_TO_REAL(Cycle)); // 手册规定TIME需转REAL Last_PV : PV_Filtered; // 3. PID计算手册强调积分项需防饱和 IF NOT Manual THEN // 比例项 P_Term : Kp * Error; // 积分项抗饱和仅当输出未达限幅时累加 IF NOT Is_Saturated THEN Integral : Integral (Kp / Ti) * Error * TIME_TO_REAL(Cycle); END_IF; // 微分项 D_Term : -Td * Derivative; // 总输出 MV : P_Term Integral D_Term; ELSE MV : MV_Manual; END_IF; // 4. 输出限幅与饱和检测手册要求限幅必须显式处理 IF MV MV_Limit_Low THEN MV : MV_Limit_Low; Is_Saturated : TRUE; ELSIF MV MV_Limit_High THEN MV : MV_Limit_High; Is_Saturated : TRUE; ELSE Is_Saturated : FALSE; END_IF; // 5. 限幅后重新赋值确保MV在合法范围 MV : LIMIT(MV_Limit_Low, MV, MV_Limit_High); // 使用手册定义的LIMIT功能5.3 在Codesys中部署的关键步骤创建资源在项目树右键→Add Object→Resource命名为TEMP_CTRL_RES配置任务右键资源→Add Task设置Execution ModeCyclicCycle TimeT#20ms实例化功能块在任务的PLC_PRG程序中声明Temp_PID_1 : FB_TempPID; // 实例名必须唯一连接变量将Temp_PID_1.SP绑定HMI设定值变量Temp_PID_1.PV绑定温度传感器变量Temp_PID_1.MV绑定阀门控制变量下载前检查Codesys菜单→Project→Validate确认无Type mismatch或Undefined variable错误。5.4 验证方法用手册原理反推调试路径验证滤波效果在调试窗口观察PV_Filtered与原始PV施加阶跃干扰应看到PV_Filtered变化滞后且平滑验证抗饱和将MV_Limit_High设为10.0手动增大SP使MV达限幅此时Integral值应停止增长监控Integral变量验证微分先行突然改变SP观察MV输出是否无突变因微分项基于PV变化率验证任务周期用T#20ms任务中的MV更新频率用示波器抓取阀门控制信号应为50Hz方波。从那以后我每次做温控项目都强制走一遍这个PID模块的四个验证点——不是因为代码有多完美而是手册教会我真正的可靠性不来自参数调优而来自对标准模型每一层约束的敬畏。希望帮到你。本文还有配套的精品资源点击获取