首页 / 资讯中心 / 文章详情

PLC编程语言进阶:STL、ST、SCL核心差异与选型实战指南

PLC编程语言进阶:STL、ST、SCL核心差异与选型实战指南 ★ FEATURED ARTICLE
1. 工控编程语言入门从梯形图到STL、ST、SCL的进阶路线刚入行做PLC编程那会儿我接触的第一个项目是西门子S7-200 SMART当时带我的师傅扔给我一个梯形图程序说“先把这个逻辑看懂再说”。那会儿我连常开常闭都分不太清更别提什么STL、SCL了。后来做非标项目调试遇到一个十几轴的伺服控制梯形图写得跟蜘蛛网似的改一个逻辑要翻十几页那时候才真正意识到梯形图不是万能的高级编程语言该学还得学。这篇文章想聊的就是工控圈里经常被提及但又容易被混淆的几个概念STL、ST、SCL。它们都是PLC编程语言但定位、用法、适用场景完全不同。很多新手在论坛上搜“ST语言”和“SCL”的区别得到的答案往往是“差不多”或者“一个是西门子的一个是通用的”这种模糊的回答在实际项目中会让人踩坑。我会从实际项目出发把这几种语言的核心逻辑、选型依据、实操要点和避坑经验一次讲透。不管你是刚接触PLC编程的新手还是写了几年梯形图想往高级语言转型的老手这篇文章都能给你一个清晰的路线图。我不会只讲语法而是重点说清楚什么场景该用什么语言、为什么这么选、实际写的时候要注意什么。这些经验是我在冷库监控、大棚灌溉、十字路口红绿灯、抢答器、六轴机械臂仿真这些项目里一点点攒出来的。2. 核心概念拆解STL、ST、SCL到底分别是什么2.1 STL西门子的“汇编语言”强大但门槛高STL全称Statement List中文叫语句表是西门子PLC尤其是S7-300/400系列的一种底层编程语言。它的写法类似于汇编每一行是一条指令直接操作累加器和寄存器。比如A I0.0 JNB _001 L MW10 T MW20 _001: NOP 0这段代码的意思是如果I0.0为1就把MW10的值传给MW20。看起来简单但STL的坑在于它没有高级语言的结构化语法所有逻辑都要靠跳转指令来实现。写一个IF-ELSE要自己定义标签写循环要自己控制跳转程序可读性很差。那为什么还要用STL因为执行效率高。在S7-300/400时代CPU资源有限STL可以直接操作寄存器扫描周期比梯形图短。另外有些功能梯形图根本实现不了比如间接寻址、指针操作、复杂的数学运算只能用STL。我做过一个冷库监控项目需要根据温度传感器的值动态调整PID参数用梯形图写起来非常别扭换成STL之后代码量少了三分之一。但STL的缺点也很明显调试困难、可读性差、移植性差。一个几百行的STL程序过两个月自己都看不懂。而且STL是西门子独有的换到三菱、汇川就用不了。所以现在新项目除非有特殊需求我一般不建议用STL。2.2 STIEC标准下的结构化文本通用性最强ST全称Structured Text是IEC 61131-3标准定义的五种PLC编程语言之一另外四种是梯形图LD、功能块图FBD、指令表IL、顺序功能图SFC。它的语法类似于Pascal支持IF-THEN-ELSE、FOR、WHILE、CASE等结构化语句写起来像高级语言。举个例子用ST写一个电机启停逻辑IF StartBtn AND NOT StopBtn THEN Motor : TRUE; ELSIF StopBtn THEN Motor : FALSE; END_IF;这段代码在任何支持IEC 61131-3标准的PLC上都能跑不管是西门子、三菱、汇川还是倍福。ST的最大优势就是通用性和可读性。我做过一个汇川AM763的项目之前用西门子写的ST程序稍微改改就能移植过去省了大量重写的时间。ST的另一个优势是适合写复杂算法。比如PID控制、模糊控制、数据滤波、数组排序用ST写比梯形图清晰得多。我在大棚灌溉项目里用ST写了一个基于土壤湿度和天气预报的灌溉决策算法大概200行代码如果用梯形图估计要画上千个触点。但ST也不是万能的。它的扫描机制和梯形图不同梯形图是“从左到右、从上到下”循环扫描ST是顺序执行。如果程序里有多个IF嵌套要注意执行顺序对输出的影响。另外ST的调试不如梯形图直观在线监控时看不到“能流”的流动只能看变量值。2.3 SCL西门子对ST的“方言实现”生态绑定深SCL全称Structured Control Language是西门子对IEC 61131-3标准中ST语言的具体实现。语法上和ST基本一致但有一些西门子特有的扩展比如支持西门子的数据类型如DATE_AND_TIME、STRING可以调用西门子的系统函数块如RD_SYS_T读取系统时间在TIA Portal中与梯形图、STL混合编程很多新手会问“ST和SCL到底有什么区别”简单说ST是标准SCL是西门子的方言。就像C语言和某个编译器厂商的C语言扩展核心语法一样但细节有差异。在实际项目中如果你用的是西门子PLCS7-1200/1500那SCL就是你的ST。如果你用的是汇川、三菱、欧姆龙那它们各自有自己的ST实现语法大同小异但函数库和数据类型定义不同。我个人的经验是学ST用SCL。先把IEC标准下的ST语法学扎实然后针对具体品牌的PLC查手册了解它的特殊函数和数据类型。这样换平台的时候学习成本最低。2.4 三者的核心差异对比对比维度STLSTSCL标准归属西门子私有IEC 61131-3标准西门子对ST的实现语法风格类汇编指令式类Pascal结构化类Pascal结构化可读性差好好执行效率高中中移植性差仅西门子好跨品牌差仅西门子适用场景底层操作、间接寻址复杂算法、跨平台项目西门子项目中的复杂逻辑学习难度高中中这张表是我自己在选型时的参考依据。简单说新项目优先用ST/SCL老设备维护才考虑STL。如果项目要求跨品牌移植那ST是唯一选择。3. 为什么需要高级编程语言梯形图的局限与突破3.1 梯形图的“舒适区”和“天花板”梯形图是PLC编程的“母语”几乎所有PLC入门教程都从梯形图开始。它的优势很明显直观、易学、调试方便。一个简单的启保停电路画几个触点就搞定了在线监控时能看到能流流动排查问题很快。但梯形图有它的“天花板”。我总结了几种梯形图搞不定或者搞起来很痛苦的情况第一种复杂数学运算。比如要计算一个六轴机械臂的逆运动学涉及大量的三角函数、矩阵运算。用梯形图写每个运算都要调用一个功能块连起来像迷宫一样。用ST写几行公式就搞定了。第二种数组和循环操作。比如要处理100个温度传感器的数据找出最大值、最小值、平均值。梯形图没有数组概念只能用间接寻址或者重复调用功能块代码冗长且容易出错。ST里一个FOR循环就解决了。第三种字符串处理。比如要从扫码枪读取的字符串中提取产品型号梯形图处理字符串非常麻烦ST里有专门的字符串函数。第四种状态机逻辑。比如十字路口红绿灯控制有多个状态东西绿灯、东西黄灯、南北绿灯、南北黄灯状态之间有条件跳转。用梯形图写需要大量的中间变量和自锁电路用ST的CASE语句结构清晰一目了然。第五种算法复用。比如PID控制、滤波算法用ST写成功能块FB可以在不同项目中重复调用。梯形图虽然也能做成FB但参数传递和内部逻辑的封装不如ST灵活。3.2 高级语言带来的效率提升一个真实案例去年我做一个冷库监控系统需要同时监控8个冷库的温度、湿度、压缩机状态并根据设定值自动调节。最开始用梯形图写每个冷库的逻辑复制8遍程序有2000多步改一个参数要改8个地方调试的时候经常漏改。后来我改用SCL重写把单个冷库的控制逻辑封装成一个功能块FB输入参数是温度设定值、湿度设定值、传感器地址输出是压缩机启停、风机启停、报警信号。主程序里只需要调用8次这个FB传入不同的参数。代码量从2000多步降到300多步而且改逻辑只需要改FB内部所有冷库同步生效。这个案例让我深刻体会到高级语言的核心价值不是“炫技”而是“封装”和“复用”。梯形图适合写简单的、独立的逻辑高级语言适合写复杂的、可复用的逻辑。两者不是替代关系而是互补关系。3.3 选型决策什么时候该用哪种语言基于我的项目经验整理了一个选型决策表场景推荐语言理由简单启保停、互锁逻辑梯形图直观、调试快复杂数学运算ST/SCL公式表达清晰数组和循环处理ST/SCL支持FOR/WHILE字符串处理ST/SCL有专用函数状态机逻辑ST/SCLCASE语句清晰算法封装复用ST/SCLFB封装灵活底层寄存器操作STL直接操作累加器间接寻址、指针STL梯形图和ST不支持跨品牌移植STIEC标准通用老设备维护STL原程序就是STL提示不要为了用高级语言而用高级语言。一个简单的电机启停用梯形图三行搞定用SCL写反而显得啰嗦。选型的核心原则是用最适合场景的语言而不是最“高级”的语言。4. STL实操要点从语法到避坑4.1 STL的核心指令体系STL的指令可以分为几大类位逻辑指令A与、O或、AN与非、ON或非、X异或。这些指令操作的是状态字中的RLO逻辑运算结果。比较指令I整数相等、I整数大于、R浮点数小于等。比较指令会改变状态字。赋值和传送指令L装载到累加器、T从累加器传送到目标、MOVE等。跳转指令JU无条件跳转、JC条件跳转、JNBRLO为0时跳转等。算术指令I整数加、*R浮点数乘、SQRT开方等。转换指令ITD整数转双整数、DTR双整数转浮点、BTIBCD转整数等。这些指令看起来不多但组合起来能实现非常复杂的逻辑。关键是理解累加器ACCU和状态字Status Word的工作机制。STL的运算都是在累加器里进行的状态字记录运算结果是否为零、是否溢出、是否为负等。4.2 一个完整的STL实例间接寻址实现配方管理假设有一个配料系统需要根据配方号1-10读取对应的配料参数每种原料的重量。配方数据存储在DB100中每个配方占20个字节。用STL实现L #RecipeNo // 装载配方号 L 1 -I // 配方号减1因为地址从0开始 L 20 *I // 乘以20得到偏移量 LAR1 // 将偏移量装载到地址寄存器1 L DB100.DBW[AR1,P#0.0] // 读取第一种原料重量 T #Weight1 L DB100.DBW[AR1,P#2.0] // 读取第二种原料重量 T #Weight2 // ... 继续读取其他参数这段代码的核心是地址寄存器AR1和偏移量寻址。[AR1,P#0.0]表示以AR1为基地址偏移0字节。通过改变AR1的值可以访问DB100中不同位置的数据。如果用梯形图实现同样的功能需要用到间接寻址功能块或者用大量的比较指令判断配方号代码量至少翻三倍。4.3 STL避坑指南坑一累加器覆盖。STL只有两个累加器ACCU1和ACCU2所有运算都在它们之间进行。如果连续做多个运算要注意前一个运算的结果是否被覆盖。我踩过一次坑先算了一个加法结果存在ACCU1然后调用了一个比较指令比较指令会改变状态字但不会改变ACCU1。但如果中间调用了LOAD指令ACCU1就被覆盖了。坑二跳转标签的作用域。STL的跳转标签是全局的同一个块内不能重名。如果在一个FC里用了_001标签在另一个FC里也用_001编译不会报错但运行时可能跳转到错误的位置。建议标签命名加上功能前缀比如_PID_001。坑三数据类型不匹配。STL对数据类型的要求很严格。比如L MW10装载的是16位整数如果后面用DTR双整数转浮点会先把MW10扩展成32位但扩展的方式取决于MW10是有符号还是无符号。如果MW10是负数扩展后会变成很大的正数。这种问题在梯形图里不容易出现因为梯形图的数据类型是显式声明的。坑四在线监控的局限性。STL在线监控时只能看到累加器和状态字的值看不到“能流”的流动。调试复杂逻辑时建议在关键位置插入T指令把中间结果写到临时变量里方便监控。注意STL在S7-1200/1500中的支持已经弱化TIA Portal虽然支持STL但推荐使用SCL。新项目除非有特殊需求否则不建议用STL。5. ST/SCL实操要点从语法到工程化5.1 ST/SCL的基础语法速查ST/SCL的语法和Pascal类似核心结构包括变量声明VAR StartBtn : BOOL; Motor : BOOL; Counter : INT; Temp : REAL; END_VAR条件语句IF condition THEN // 语句 ELSIF condition THEN // 语句 ELSE // 语句 END_IF;循环语句FOR i : 1 TO 10 BY 1 DO // 语句 END_FOR; WHILE condition DO // 语句 END_WHILE; REPEAT // 语句 UNTIL condition END_REPEAT;分支语句CASE State OF 0: // 状态0的处理 1: // 状态1的处理 2: // 状态2的处理 ELSE // 默认处理 END_CASE;函数和功能块FUNCTION_BLOCK FB_MotorControl VAR_INPUT Start : BOOL; Stop : BOOL; END_VAR VAR_OUTPUT Run : BOOL; END_VAR VAR InternalFlag : BOOL; END_VAR BEGIN IF Start AND NOT Stop THEN Run : TRUE; ELSIF Stop THEN Run : FALSE; END_IF; END_FUNCTION_BLOCK这些语法看起来简单但实际写的时候有很多细节要注意。5.2 一个完整的SCL实例十字路口红绿灯控制十字路口红绿灯是一个典型的状态机逻辑。假设东西方向和南北方向交替通行每个方向有红、黄、绿三盏灯黄灯亮3秒绿灯亮20秒红灯亮23秒等待另一个方向。用SCL的CASE语句实现FUNCTION_BLOCK FB_TrafficLight VAR_INPUT Start : BOOL; Emergency : BOOL; END_VAR VAR_OUTPUT EW_Red : BOOL; EW_Yellow : BOOL; EW_Green : BOOL; NS_Red : BOOL; NS_Yellow : BOOL; NS_Green : BOOL; END_VAR VAR State : INT; Timer : TON; StepTime : TIME; END_VAR BEGIN IF Emergency THEN // 紧急模式全部红灯 EW_Red : TRUE; EW_Yellow : FALSE; EW_Green : FALSE; NS_Red : TRUE; NS_Yellow : FALSE; NS_Green : FALSE; State : 0; RETURN; END_IF; IF NOT Start THEN State : 0; RETURN; END_IF; CASE State OF 0: // 初始状态东西绿灯南北红灯 EW_Green : TRUE; EW_Yellow : FALSE; EW_Red : FALSE; NS_Red : TRUE; NS_Yellow : FALSE; NS_Green : FALSE; StepTime : T#20S; State : 1; 1: // 东西黄灯南北红灯 EW_Green : FALSE; EW_Yellow : TRUE; EW_Red : FALSE; NS_Red : TRUE; NS_Yellow : FALSE; NS_Green : FALSE; StepTime : T#3S; State : 2; 2: // 东西红灯南北绿灯 EW_Green : FALSE; EW_Yellow : FALSE; EW_Red : TRUE; NS_Red : FALSE; NS_Yellow : FALSE; NS_Green : TRUE; StepTime : T#20S; State : 3; 3: // 东西红灯南北黄灯 EW_Green : FALSE; EW_Yellow : FALSE; EW_Red : TRUE; NS_Red : FALSE; NS_Yellow : TRUE; NS_Green : FALSE; StepTime : T#3S; State : 0; END_CASE; Timer(IN : TRUE, PT : StepTime); IF Timer.Q THEN Timer(IN : FALSE); // 状态切换在CASE中已经处理 END_IF; END_FUNCTION_BLOCK这段代码的核心是CASE语句实现状态机。每个状态设置对应的输出和持续时间然后等待定时器超时切换到下一个状态。相比梯形图SCL的版本结构清晰修改状态逻辑非常方便。5.3 ST/SCL工程化实践封装与复用ST/SCL最大的价值在于封装。我习惯把常用的功能封装成FB功能块比如FB_Motor电机控制输入启停、故障复位输出运行、故障、电流FB_PIDPID控制输入设定值、反馈值、参数输出控制量FB_Filter数据滤波输入原始值、滤波系数输出滤波值FB_Alarm报警处理输入报警条件、延时时间输出报警信号封装的好处是一次编写多次调用一处修改处处生效。我在冷库监控项目里把单个冷库的控制逻辑封装成FB_ColdRoom主程序里调用8次每个冷库的参数通过输入引脚传入。后来客户要求增加一个“节能模式”我只需要在FB_ColdRoom里加一段逻辑8个冷库同时生效。封装的时候要注意几点第一输入输出参数要清晰。不要用全局变量所有需要外部传入的数据都通过VAR_INPUT所有需要输出的数据都通过VAR_OUTPUT。这样FB的接口一目了然也方便复用。第二内部变量要初始化。FB内部的静态变量VAR在第一次调用时会初始化为默认值但后续调用会保持上一次的值。如果某个变量需要在每次调用时重置要在FB开头手动赋值。第三避免在FB里用绝对地址。比如直接访问I0.0或Q0.0这样FB就绑定了具体的硬件无法复用。正确的做法是通过输入参数传入地址或者用符号寻址。5.4 ST/SCL避坑指南坑一扫描顺序的影响。ST/SCL是顺序执行的如果程序里先读了一个变量后面又修改了它读到的就是旧值。梯形图虽然也是顺序扫描但能流的概念让程序员更容易理解执行顺序。写ST的时候要特别注意变量的读写顺序。坑二定时器的使用。ST里的定时器是功能块需要实例化后调用。比如TON定时器每次调用都要传入IN和PT然后读取Q和ET。如果忘记调用定时器不会工作。我见过一个新手声明了定时器但忘记在程序里调用调试了半天找不到问题。坑三浮点数比较。浮点数在计算机里是近似存储的直接用比较两个浮点数可能得到错误的结果。正确的做法是判断两个数的差值是否小于一个很小的阈值IF ABS(Value1 - Value2) 0.001 THEN // 认为相等 END_IF;坑四字符串处理。ST的字符串函数在不同品牌PLC上差异较大。比如西门子SCL的CONCAT函数和汇川ST的字符串拼接函数参数顺序可能不同。跨平台移植时要特别注意。坑五在线修改的限制。在RUN模式下在线修改ST/SCL代码有些PLC不支持或者只支持修改部分内容。如果修改了变量声明通常需要重新下载程序。调试阶段建议先把逻辑写完整再下载测试。提示写ST/SCL的时候建议用版本管理工具如Git管理代码。ST/SCL是文本格式非常适合做版本对比。我习惯每完成一个功能就提交一次出问题可以快速回滚。6. 常见问题与排查技巧实录6.1 编译错误排查问题变量未声明。ST/SCL要求所有变量必须先声明后使用。如果编译报“未定义的变量”检查变量声明区是否遗漏。问题数据类型不匹配。比如把INT赋值给REAL或者把BOOL用在算术运算里。ST/SCL是强类型语言类型不匹配会编译报错。解决方法是显式转换INT_TO_REAL(MyInt)。问题语法错误。ST/SCL的语法比较严格少一个分号、多一个括号都会报错。建议用编辑器的自动缩进和括号匹配功能减少低级错误。6.2 运行时问题排查问题程序不执行。检查FB是否被调用。ST/SCL里的FB必须显式调用才会执行如果只声明了FB实例但没有调用里面的逻辑不会运行。问题输出不变化。检查是否有多个地方给同一个输出赋值。ST/SCL是顺序执行后面的赋值会覆盖前面的。如果输出在多个IF分支里被赋值要确保逻辑互斥。问题定时器不工作。检查定时器的IN引脚是否一直为TRUE。TON定时器需要IN从FALSE变为TRUE才开始计时如果IN一直是TRUE定时器不会重新触发。问题浮点数计算结果异常。检查是否有除以零的情况。ST/SCL里除以零不会报错但结果可能是NaN或Inf。建议在除法前加判断IF Divisor 0 THEN Result : Dividend / Divisor; ELSE Result : 0; END_IF;6.3 常见问题速查表问题现象可能原因排查方法解决方案编译报“未定义变量”变量未声明检查VAR区补充声明编译报“类型不匹配”数据类型不一致检查赋值语句显式类型转换程序不执行FB未调用检查主程序添加FB调用输出不变化多处赋值覆盖搜索输出变量确保逻辑互斥定时器不工作IN引脚状态不对监控IN引脚确保IN有下降沿浮点数异常除以零检查除法运算加除数判断在线修改失败PLC不支持查看手册重新下载程序移植后报错品牌差异对比函数库替换品牌特有函数6.4 独家避坑技巧技巧一用注释标记状态。在CASE语句的每个分支前加注释说明当前状态的含义和切换条件。比如CASE State OF 0: // 待机状态等待启动按钮 1: // 运行状态电机已启动 2: // 暂停状态等待恢复按钮 3: // 故障状态等待复位按钮 END_CASE;技巧二用辅助变量调试。在关键位置把中间结果写到辅助变量里在线监控时可以看到这些变量的值。调试完成后把辅助变量删掉或注释掉。技巧三分步测试。不要一次性写完所有逻辑再测试。先写最简单的部分测试通过后再加新功能。每加一个功能就测试一次出问题容易定位。技巧四保留调试版本。每次重大修改前把当前版本另存为备份。如果新版本有问题可以快速回退到旧版本。技巧五用仿真软件验证。西门子的PLCSIM、汇川的AutoShop仿真功能可以在没有硬件的情况下测试逻辑。我习惯先在仿真里把逻辑跑通再下载到实际PLC。7. 工具选型与学习路径建议7.1 编程软件的选择不同品牌的PLC用不同的编程软件品牌编程软件支持语言特点西门子TIA Portal梯形图、STL、SCL、FBD功能强大生态完善西门子STEP 7 Micro/WIN SMART梯形图、STLS7-200 SMART专用三菱GX Works梯形图、ST、FBD日系PLC代表汇川AutoShop梯形图、ST国产PLC性价比高倍福TwinCAT梯形图、ST、FBD基于PC的控制系统欧姆龙Sysmac Studio梯形图、ST日系PLC新手建议从西门子TIA Portal入手因为资料最多、生态最完善。学会之后再学其他品牌会容易很多。7.2 学习路径建议第一阶段梯形图基础。掌握基本逻辑与或非、自锁互锁、定时器计数器能写简单的启保停、顺序控制。第二阶段ST/SCL入门。学习变量声明、条件语句、循环语句、CASE语句能用ST写状态机和简单算法。第三阶段STL进阶。了解累加器、状态字、地址寄存器能读懂和修改STL程序。第四阶段工程化实践。学习FB封装、库管理、版本控制能独立完成中小型项目。第五阶段跨平台移植。学习不同品牌PLC的差异能把程序从一个品牌移植到另一个品牌。这个路径是我自己走过的大概花了两年时间。如果每天能投入2-3小时半年到一年可以达到第三阶段。7.3 学习资源推荐官方手册西门子的《S7-1200/1500编程手册》、汇川的《AM系列编程手册》是最权威的参考资料。在线课程各大工控论坛和视频平台有大量免费教程建议从项目实战类的课程入手。实践项目买一个二手的PLC比如西门子S7-200 SMART或者汇川H5U自己搭一个小系统从红绿灯、抢答器、传送带控制这些经典项目开始练手。社区交流工控论坛、技术群遇到问题可以提问。但要注意网上的答案不一定准确最好自己验证。提示学习PLC编程动手实践比看书重要十倍。看十遍手册不如自己写一遍程序。建议边学边做项目遇到问题再查资料这样学得最快。8. 从工控科普到实战我的个人体会写了这么多最后分享几点我在实际项目中的体会。第一语言只是工具逻辑才是核心。不管是梯形图、STL还是SCL最终目的都是实现控制逻辑。不要纠结于“哪种语言更好”而要关注“哪种语言更适合当前场景”。我见过用梯形图写出非常优雅的程序也见过用SCL写出乱七八糟的代码。工具不重要思路才重要。第二封装和复用是进阶的关键。新手写程序喜欢把所有逻辑写在一个块里。老手写程序会把功能拆分成独立的FB主程序只负责调用。这样代码清晰、易维护、易复用。我建议从写第一个项目开始就养成封装的习惯。第三调试能力比编程能力更重要。程序写出来只是第一步能快速定位和解决问题才是真本事。我调试的时候习惯先看输入输出是否正常再看中间变量最后看逻辑流程。这个顺序能解决80%的问题。第四持续学习是必须的。工控行业变化很快新的PLC、新的协议、新的工具层出不穷。今天学的ST/SCL明天可能就有新的语言出现。保持学习的心态才能不被淘汰。第五安全永远是第一位的。工控程序控制的是真实的设备一个逻辑错误可能导致设备损坏甚至人身伤害。写程序的时候一定要考虑异常情况传感器故障怎么办通信中断怎么办急停按钮按下怎么办这些安全逻辑比控制逻辑更重要。最后再分享一个小技巧如果你刚开始学ST/SCL可以先从改写现有的梯形图程序开始。找一个你熟悉的梯形图项目用ST/SCL重写一遍对比两种语言的差异。这样学起来最快也最容易理解两种语言的优缺点。
阅读完成 · 觉得有帮助?
咨询建站