简介《tricon功能块》面向工业自动化初学者与Tricon控制系统入门读者聚焦功能块的基础认识与查阅帮助读者理解输入/输出引脚、数据类型及常用标准功能块的使用场景。压缩包内共1个doc文件大小约237KB篇幅集中便于按章节检索数据类型、标准编程函数、标准功能块以及I/O与内部信号符号说明。内容涵盖BOOL、DATE、DINT、REAL、TIME等数据类型数据类型转换、数学、算术、布尔、位串、选择、比较、字符串等标准函数双稳态、边缘检测、计数器、定时器等标准功能块并附STDLIB、TCXLIB中常见功能说明及模拟量标定等条目。已有431人浏览学习适合作为现场调试、PLC编程入门和术语速查的辅助资料也可用于对照理解功能块引脚含义与常用函数行为。1. 从「左进右出」说起tricon 功能块到底是个什么东西老式电饭锅只有一个按钮按下去就煮而洗衣机面板背后进水、洗涤、脱水、排水各有一根线进出翻到背板上能看到一张由方框和连线组成的图。tricon 功能块就是这种图里的基本单元一个方框只干一件小事加两个数、判断谁大谁小、让一个开关信号晚三秒动作左边伸进来的引脚是原料右边递出去的引脚是成品。搞懂它等于拿到整套控制程序的词汇表图纸上随便一个方块你都能立刻说出它吃什么数据、吐出什么结果、什么时候会翻脸。这份说明的价值就在这儿——它把上百个方块按用途分好了类你不用一个个去试。2. 输入为什么长在左边功能块的方向感与数据类型第一次看这类图纸很多人会下意识觉得方框就是画个框引脚放左放右只是排版美观。真上手接错一次线就明白了方向是硬的。2.1 一根线只能顺着流引脚方向背后的扫描机制控制程序不是事件驱动的它按扫描周期一圈一圈地跑。每个周期里CPU 走到一个功能块面前先把左边引脚上的当前值读进来算一遍把结果写到右边引脚上再走向下一个方块。所以左边永远代表读右边永远代表写这个方向是扫描顺序刻进去的不是画图软件的习惯。由此推出三条铁律。第一输出不能直接接输出两个方块各自往同一根线上写值谁赢取决于谁后执行这种问题在现场表现为偶发乱跳属于最难查的一类玄学故障。第二一个输出可以接多个输入这叫扇出是允许的因为读的一方不改值。第三输入引脚不接线不会报错它通常取一个默认值多数是 0 或 FALSE然后安安静静地算出一个错结果。第三条是最坑的。某开发者调一个延时块输出死活不动作盯着程序看了两个小时最后发现是 IN 引脚忘了连。程序不报错、不警告只是老老实实地把永远不启动算了出来。所以看到输出不对第一反应应该是回头数一遍这个块的输入引脚是不是全接上了而不是怀疑算法。提示接线前先把方块的输入引脚从左到右数一遍对照说明确认每个引脚的数据类型比事后排查省时间。2.2 每个引脚都挑食十二种数据类型的分工功能块的引脚不是来者不拒的每个引脚上都标着一个数据类型英文缩写接错了类型轻则编译不过重则数值被悄悄截断。这份说明里列出的类型可以分成四组来看。缩写全称通俗理解典型样子BOOL布尔型一个开关只有通和断TRUE / FALSEWORD字型16 个开关排成一排一串位DWORD双字型32 个开关排成一排一串位INT整型小范围的整数-32768 ~ 32767DINT双整型大范围的整数模拟量原始值常用它比 INT 宽REAL实数型带小数点的数25.6LREAL长实数型小数位更多的实数精度更高TIME时间段一段时长不是某个时刻10sTOD时间点一天里的某一刻10:03:04.000DATE日期型只有年月日没有钟点1970-01-02DT日期时间型日期和时间接在一起1970-01-02-00:00:00.000STRING字符型一串文字配方名最容易混的是时间那三个。TIME 说的是多久比如延时 10 秒它没有起点TOD 说的是几点几刻是个坐标DT 是 DATE 和 TOD 拼起来的完整时间戳。说明里专门有一个功能就是干这个拼接活的——输入一个是 DATE#1970-01-02一个是 TOD#00:00:00.000输出就是 DT#1970-01-02-00:00:00.000。记录一条报警发生在什么时候用 DT设置一个延时多久用 TIME两者别互相赋值。整型和实数的边界也值得说一句。现场进来的模拟量原始码值通常是 DINT因为它是一个没有小数概念的整数一旦你把它换算成工程量比如 25.6 摄氏度就必须转到 REAL否则小数点后的部分直接被抹掉。这个抹除是静默的不报错。说明里那一整类形如***_TO_***的数据类型转换函数就是专门处理这种搬运的比如把 BOOL 转成 DWORD或者把 DINT 转成 REAL。2.3 八个字母的暗号w、a、v、y、d、c、t、p 各代表什么这份说明有一处特别贴心的地方它给引脚上的信号起了一套单字母代号看图纸时扫一眼字母就知道这根线是什么货色。代号含义数据类型w未标定的模拟量输入DINTa定标后的模拟输入REALv未标定的模拟量输出DINTy定标后的模拟输出REALd数字量输入BOOLc数字量输出BOOLt温度输入DINTp脉冲输入REALw 和 a 是一对v 和 y 是一对区别只在标定这一步做没做。现场传感器送进来的是一段电流对应的原始码值比如 4000 到 20000这个数是 w经过换算变成 0 到 100 的百分比这个数是 a。同一个物理量两种表达中间隔着一个标定环节。d 和 c 就是普通开关量按钮、限位、继电器进去是 d出来是 c。t 单独给温度留了个口子因为温度通道常常有自己的处理方式。p 是脉冲输入编码器、流量计这类按脉冲计数的信号走它用实数是因为脉冲累积起来可能很大。看图纸时如果看到一根线标着 w 却接到了标着 a 的引脚上不用往下看了这处标定要么漏了要么做错了。这套字母表最大的用处就是让你在接线的瞬间就能发现类型不匹配而不是等到画面上的数值全是 0 才回头找。3. 函数、功能块、符号表三本工具书各管什么这份说明的目录分成几大块标准编程函数、标准功能块、I/O 符号说明、内部信号符号说明。名字都叫标准但它们的脾气完全不同。3.1 标准编程函数算完就走的临时工函数的特点是没有记忆。你给它几个输入它算完给你一个输出然后什么都不留。下一次调用它对你上次给了什么一无所知。取绝对值是这样开方、指数、对数、加减乘除、比较大小、与或非全都是这样。说明里给函数分了八类看名字就能猜出用途数据类型转换、数学函数、算术函数、布尔函数、位串函数、选择函数、比较函数、字符串特性函数。这个分类方式本身就是个学习路径先搞清楚数据怎么转再学怎么算最后学怎么挑和怎么比。(* 标准函数调用即返回不保留任何状态 *) rBig : MAX(wRawA, wRawB); (* 取两个未标定模拟量里较大的那个 *) rAbs : ABS(iDelta); (* 取绝对值负的也变正 *) bOver : GT(rAbs, 100.0); (* 大于比较成立返回 TRUE否则 FALSE *) iWord : BOOL_TO_DWORD(dFlag); (* 把一个开关量转成双字型 *)上面四行的参数含义分别是MAX和ABS的输出类型跟输入一致GT的两个输入是待比较的数输出固定是 BOOLBOOL_TO_DWORD属于那一整类***_TO_***转换函数输入是布尔输出是双字。这四行写完就结束了没有任何残留你在程序里调用一百次和调用一次占用的资源是一样的。临时工的好处是干净坏处是它记不住事。想做按一下按钮亮灯、再按一下灭灯函数帮不了你因为函数每次被调用时都不知道上一次按钮是什么状态。3.2 标准功能块带着记忆值班的门卫功能块跟函数的最大差别是它有一份自己的档案。你在程序里给它起一个实例名这个实例名下面就存着它的当前状态每个扫描周期都会更新。所以功能块能做的事函数做不了记住上一秒的输入是什么、数到第几个了、延时还剩多久。说明里把标准功能块分成四类这个分法非常准几乎是带记忆的活儿的全集双稳态功能块RS 和 SR 触发器记住现在是置位还是复位。边缘检测功能块上升沿和下降沿记住上一次扫描时这个信号是 0 还是 1。计数器功能块CTU、CTD、CTUD记住数到几了。定时器功能块TON、TOF、TP记住从什么时候开始计时的、已经过去多久。(* 标准功能块必须给实例名实例里存着状态 *) TON_Start(IN : dStartBtn, PT : T#5s); (* 延时接通启动信号保持满 5 秒Q 才变 TRUE *) dMotor : TON_Start.Q; (* 从实例上取输出Q 是延时到位的标志 *) iDone : TON_Start.ET; (* ET 是已经过去的时间用来做进度显示 *) CTU_Part(CU : dPulse, PV : 100); (* 每来一个脉冲CV 从 PV 往上加 *) bFull : CTU_Part.Q; (* 计到条件满足时 Q 变 TRUE *)三个参数值得单独说清楚。IN是启动条件它必须一直保持为真延时才会走完中途松开就前功尽弃。PT是预设时间类型是 TIME写的时候带单位。Q是输出结论ET是过程量很多人在画面上显示还剩几秒用的就是 ET。至于TON_Start和CTU_Part这两个名字你随便起但一个块对应一个实例两个地方想用两个独立的延时就得起两个不同的实例名。这一点在后面还会专门说它是新手最容易翻的车。3.3 内部信号符号r、i、e、f、g、k、t、m 是程序里的暗线除了引脚上的字母说明里还有一套内部信号的代号标的是程序内部那些不出现在图纸边界上的变量。代号含义通俗理解r内部模拟量REAL程序自己算出来的小数i内部模拟量DINT程序自己算出来的整数e内部读写模拟量既能读又能写的中间量f内部自读数字量只在本程序内读的开关量g内部读写数字量可读可写的开关量k固定常数写死的数值不随运行改变t时间常数写死的时长m报警信号用来触发提示的开关量这套符号的意义在于划界。k 和 t 是常数运行中不该变如果看到它们在程序里被赋值说明有人把标定参数当运行数据用了这属于设计上的坑。m 单独留给报警意味着报警信号有独立的走向不会跟普通开关量混在一起。r 和 i 的区别又一次落在整数和小数上——中间计算用哪个决定了你的精度在哪一步被截断。4. 拆开五个最常用的块从取绝对值到限幅标准库里上百个块真正常用的就那么十来个。挑最有代表性的几个拆开看剩下的基本是同一个套路。4.1 数学与取整绝对值、指数、对数还有两个会看错眼的取整数学这一组的用法很直白。取绝对值就是把负号去掉。指数是 Y 等于 e 的 X 次方幂运算是 Y 等于 x1 的 x2 次方注意这两个不是一回事前者底数固定是自然常数后者底数由你给。对数有两个一个是自然对数一个是以 10 为底的对数工程上算分贝、算数量级常用后者。三角函数里反三角的 arcsin、arccos、arctan 输出单位是弧度不是角度你要是直接拿去显示会得到一个 0 到 1.57 之间的怪数得自己乘个系数换成角度。真正容易出问题的是取整。说明里有两个方向相反的取整函数。向上取整输出是大于等于输入的最小整数再转成实数。输入 1.1 得 2.0输入 1.0 得 1.0。向下取整输出是小于等于输入的最大整数再转成实数。输入 2.8 得 2.0。注意它们返回的仍然是实数类型不是整数2.0 和 2 在类型上是两回事。另外这两个函数都不是四舍五入。想要四舍五入得自己加 0.5 再向下取整或者用语言自带的舍入函数。计算件数、算托盘数这类场景方向选错会导致整体差一件这个错误在小批量试跑时往往看不出来一上量产就暴露。这里还有一个血泪经验说明文档里的例子不一定都严谨。向下取整那条前半句举的例子是对的后面又跟了一个和定义矛盾的例子。遇到这种情况以文字定义为准别照着例子写。文档也是人写的定义是反复推敲过的例子是随手敲的。4.2 选择与比较MAX、MIN、MID、SEL、LIMIT 各管一段这一组块名字都很短但用错地方的概率不低。MAX 和 MIN 是取最大和最小几个输入进去出来一个。它们常用来做取多路信号里最保守的那个比如三个温度探头取最高的那个做联锁判断。MID 是取中间数规则稍微绕一点输入个数是奇数时输出正中间那个输入个数是偶数时输出中间两个数的平均值。说明里给了例子输入 1、3、5 输出 3输入 1、3 输出 2输入 1、3、5、7 输出 4。这个块在三取二之类的表决逻辑里非常好用三个探头里有一个坏了中间值仍然代表真实情况。SEL 是输入选择器由 K 值决定输出哪一个输入。K 从 0 开始数K0 输出往下数第 1 个K3 输出往下数第 4 个。这个从 0 开始是很多人第一次用会愣一下的地方按习惯以为 K1 是第一个结果整整错一位。LIMIT 是限幅三个引脚IN 是待处理的数MIN 是下限MX 是上限。IN 落在区间内就原样输出低于 MIN 输出 MIN高于 MX 输出 MX。这个块在模拟量处理里几乎必用。(* 把现场进来的原始码值换算成 0~100 的工程量再做限幅保护 *) (* 假设该通道原始码值范围是 0~20000对应工程量 0~100 *) rEng : DINT_TO_REAL(wRaw) / 20000.0 * 100.0; (* 先转实数再算避免整数除法把小数抹掉 *) rEng : LIMIT(MN : 0.0, IN : rEng, MX : 100.0); (* 传感器断线导致的超范围值一律压到边界 *) yOut : rEng; (* y 是已标定的模拟量输出可以直接上画面 *)这段代码有两个细节。第一行里必须先转成实数再除如果拿 DINT 直接除结果会被截成整数0 到 99 之间的小数全没了画面上会看到数值一跳一跳的。第二行的 LIMIT 是最后一道保险现场断线时原始码值可能冲到量程之外不限幅的话下游的比较逻辑会得到一个荒谬的数联锁可能误动或者拒动。4.3 边沿与定时一个扫描周期的脉冲和三种不同的等待上升沿检测的逻辑是CLK 从 0 变成 1 的那一刻输出一个扫描周期的脉冲之后立刻回 0哪怕 CLK 一直保持为 1。下降沿检测反过来CLK 从 1 变成 0 时给一个脉冲。一个扫描周期这个限定是关键。它不是信号为真的整段时间而是跳变发生的那一瞬间。所以边沿信号通常用来触发一次性的动作计数器加一、记录一条事件、启动一个流程。拿边沿信号去驱动一个需要持续保持的输出你会发现输出只闪了一下就没了这不是块坏了是用法错了。定时器有三个长得像但脾气完全不同。TON 是延时接通IN 从 0 变 1 之后等满 PT 这段时间Q 才从 0 变 1。IN 一断Q 立刻回 0计时清零。TOF 是延时断开IN 为 1 时 Q 就是 1。IN 从 1 变 0 之后再等满 PTQ 才变 0。中间这段 ET 会显示已经过去了多久。TP 是脉冲输出IN 从 0 变 1 时Q 立刻变 1并且保持 PT 这么长时间然后自己回 0。这期间 IN 再变也没用。三者的差别用一句话概括TON 等的是开始,TOF 等的是结束,TP 要的是固定宽度的一段。启动一台风机后要让它继续吹一会儿再停用 TOF按一下按钮让气缸动作固定两秒用 TP按下启动按钮后要求持续按住五秒才允许开机用 TON。4.4 计数与双稳态数到几以及谁说了算计数器有三个。CTU 是加计数CU 每来一个上升沿CV 就往上加最大到 32767。CTD 是减计数LD 和 CD 同时为 1 时CV 从 PV 开始往下减最小到 -32768。CTUD 是把两个合在一起既能加也能减。这里有个要留神的地方。说明里写 CTU 是CV 大于等于 0 时输出 Q 变 1这个条件跟很多人印象里的计到预设值才动作不太一样。不同实现的判定条件确实存在差异最稳妥的做法是第一次使用时做一次空跑手动给几个脉冲看着 CV 和 Q 的实际变化把它记在自己的本子上。宁可花十分钟验证一次也别在生产线上赌。双稳态就是两个触发器RS 和 SR区别只有一条两个输入同时为 1 的时候听谁的。RS 是复位优先R 和 S 同时为 1输出 0SR 是置位优先同时为 1输出 1。这条差异看着微不足道但在急停、联锁这类场景里选错了就是安全边界的问题。带复位按钮的场合用 RS因为你要保证按下复位一定能把状态清掉哪怕置位信号还挂着。5. 五个最容易搞混的地方注意这些坑5.1 边沿和电平一个瞬间一整段易混点把上升沿的输出当成信号为真来用。为什么混示波器上看边沿确实产生了信号直觉上觉得它跟原信号同进退。但边沿只活一个扫描周期下一个周期就没了。怎么区分问自己一句这个动作是要触发一次还是要持续执行。记录一次事件、让计数器加一用边沿让电机一直转、让阀门一直开用电平。看到输出只闪一下就消失八成是把边沿当电平用了。5.2 TON、TOF、TP都在等等的东西不一样易混点三个定时器都有 IN、PT、Q、ET长得几乎一样随手抓一个就用。为什么混参数名相同接线方式相同只有时序行为不同而时序差异在静态图纸上完全看不出来。怎么区分看什么时候开始计时和条件消失后怎么办。TON 是条件成立后开始等条件一断立刻复位TOF 是条件消失后开始等等完才复位TP 是条件成立的瞬间开始等等的时候条件变化不影响。画一条时间轴把 IN 和 Q 的波形各画一遍三个块的差别一眼就出来了。5.3 RS 和 SR同时为 1 时听谁的易混点都是置位复位触发器都有 S 和 R 两个输入。为什么混名字只差一个字母顺序功能描述几乎对称。怎么区分只看同时为 1 的结果。RS 复位优先输出 0SR 置位优先输出 1。工程上还有一个顺带的判断依据如果这个状态关系到人身或设备安全默认必须能被打断那就该选复位优先的那个。5.4 取整和四舍五入方向错了差一件易混点以为取整就是四舍五入。为什么混日常说话里取个整经常就是四舍五入的意思但函数库里的取整是单向的。怎么区分向上取整永远往大的方向走1.1 变 2向下取整永远往小的方向走2.8 变 2四舍五入看小数部分0.5 是分界线。算需要几个箱子装货用向上取整算能装满几个整箱用向下取整。这两个场景用反了结果会稳定地差一个。5.5 函数和功能块有没有记忆决定了能不能复用易混点觉得两者只是写法不同随便挑一个顺手的。为什么混很多块在图纸上长得一样都是方框加引脚。怎么区分看它需不需要知道上一次。取绝对值不需要它是函数延时五秒需要记住起点它是功能块。功能块必须配实例名而实例名是独占的——同一个实例名在两处调用等于两个人共用一个档案袋状态会互相打架。这是我见过最多的一类翻车复制粘贴程序时忘了改实例名两个工位的行为莫名其妙地联动。复制完先搜一遍实例名是个值得养成的习惯。6. 什么时候用、什么时候别用一个温度联锁的走位设想一个再普通不过的回路一个温度探头进来超过 80 度要延时三秒确认然后停泵并报警。这个回路里每个块的选择都有讲究。温度原始码值先进来是 w先转成实数做标定得到 a这一步用函数因为算完就走。标定完的数用 LIMIT 压一下边界防止探头断线时冲出一个离谱的值把逻辑带偏。然后拿它跟 80 做比较比较函数输出一个布尔。这个布尔进 TON预设三秒因为要防抖动探头偶尔跳一下不该立刻停机。TON 的 Q 再去驱动停泵和报警。哪一步容易出问题比较那一步。如果你图省事直接拿未标定的原始码值去跟 80 比逻辑永远不成立因为原始码值的量级是几千上万。这种错误在图纸上完全看不出来只有把两个数的量级对一遍才会发现。所以我的习惯是凡是涉及模拟量比较的地方先在旁边写一行注释标清楚这个变量是 w 还是 a。再说什么时候别用。TON 不适合做精确的节拍控制它的精度取决于扫描周期扫描慢的时候误差能到几十毫秒甚至更多要精确计时得用专门的时钟功能块或者硬件定时。边沿检测也别乱撒每个扫描周期都跳变的信号边沿块会给出一串脉冲计数器会被喂到溢出。还有一个更隐蔽的不要用功能块去实现本该是函数的东西比如为了统一风格给一个取绝对值也配个实例名纯粹是浪费内存还多了一次状态更新的开销。场景该用什么别用什么换算工程量标定 LIMIT 限幅直接拿原始码值参与比较防抖动延时确认TON用边沿直接触发停机按一下动作固定时长TPTON 加自锁回路硬凑记录事件发生次数CTU 边沿用函数累加急停复位RS复位优先SR多探头表决MID 取中间值MAX 取最大值最后说个我自己的教训。早些年调一个小回路功能块复制了三份改不同的工位实例名只改了两处第三处忘了。试跑时一切正常因为三个工位不会同时动作上了产线两个工位一起启动输出开始诡异地互相干扰查了整整一天才定位到那个重复的实例名。从那以后我每次复制含功能块的段落改完第一件事就是把实例名列表拉出来搜一遍重名宁可多花两分钟也不愿再经历一次那种毫无头绪的排查。希望帮到你。本文还有配套的精品资源点击获取