3.1 基础数据类型与选型


3.1 基础数据类型与选型

本节摘要:数据类型决定了变量的格子大小与解释方式:布尔量一位、整数按位宽分档、实数带精度代价、时间量自带量纲。本节从一次真实的生产计数溢出事故讲起,给出基础类型的完整速查与选型规则,这是全线数据字典的第一层。

本章支柱页把数据设计称作青线"最划算的延期",这一节从两周数据设计的第一个决定讲起:每个信号用哪种类型。类型选错不会让程序编译失败——恰恰相反,它编译通过、运行正常,然后在某个不确定的深夜以故障的形式讨回来。

一起溢出事故:类型不是细节

先讲故事。同行某厂灌装线的班产量计数器用了16位整数,量程上限三万二千多。平时一个班两三万瓶,勉强够用;某年旺季加开班次,一个班产量爬到三万四——计数器在晚间十点过三次瞬间回卷归零,报表系统看着产量曲线垂直跳水,值班电工翻遍接线查了一夜传感器,最后是工艺员盯着数字规律看出了"过三万二就归零"。停机损失不大,笑话传了很远:整条产线最聪明的芯片,栽在一个格子太小上。

这就是类型选型的第一课:类型按量程上限选,不按当前数值选。计数类信号一律问一句"这个数这辈子最大多大",再往上一档选类型。青线的班产量、总产量计数全部用32位无符号整数——二十多亿的量程,这条产线跑到报废也数不满。

图 3-1:基础类型的格子与边界

图 3-1:基础类型的格子与边界

REAL的精度陷阱:能算,但别信它精确

32位实数用二进制浮点表达,约有七位十进制有效数字——量程从微观到天文都够用,代价是绝大多数十进制小数在二进制里是无限循环小数,存进去的那一刻就有微小偏差。单次运算无感,两种场合会爆雷。一是累加:上面演示里万次累加零点一,结果偏离百分位——流量累计若这么算,月底对账就有说不清的差。二是相等比较:两个REAL判断是否相等几乎注定失败,工程写法是判断差的绝对值小于容差。青线的流量累计改用"脉冲数整数累计加定期换算"的方案,把实数只用在显示层,账面永远干净。

工程上的分寸感在这里很重要:不必因噎废食地弃用REAL——模拟量标定、PID运算、几何计算离不开它。纪律是划清使用边界:算可以用REAL,账不能靠REAL;凡参与累计、比对、计价的量,走整数或定标路线。边界一清晰,REAL就从嫌疑犯变回好用的工具。

时间与日期:自带量纲的类型

时间值用整数毫秒硬扛是初学者常见写法,量纲错误(毫秒当秒、秒当毫秒)编译器完全无法替你拦截。标准的TIME类型自带量纲,字面量直接写"T#2S5MS"这样的表达,配错单位在编译期就报错;时刻量(如班次切换时刻)用TIME_OF_DAY。青线规范明令:凡语义是时长或时刻的变量,禁止用整数类型声明——把量纲错误拦在写代码的那一秒,而不是拦在生产线上。一个立即可用的自检:把负责程序里所有整数变量按"数量、时刻、编号"三分类,凡时刻被存成整数的,都是待改造的欠账。

信号类别 推荐类型 理由 反例教训
启停、到位、报警 BOOL 一位足够,语义清晰 用整数存开关量徒增解读成本
脉冲与产量计数 UDINT 量程二十亿,防溢出 16位计数器旺季回卷
温度、液位标定值 REAL 小数与小数点范围需要 整数定标损失分辨率
流量累计 UDINT脉冲数 整数累计无漂移 REAL累加攒误差
定时预设 TIME 量纲编译期检查 整数毫秒手误难排查
设备状态号 INT 状态有限,枚举配合 REAL存状态号精度富余但语义错位

类型登记的评审纪律

青线数据字典为每个变量登记四项:名称、类型、量程依据、单位。量程依据一栏是本节的灵魂——它强迫选择者在选型当场回答"上限哪来、精度要多少"。评审时我们抓过一个反例:某温度变量被登记为整数,依据写"够用";追问后承认是照抄了老程序,而那个测点要做零点一度的分辨率判定。一行依据栏,拦下一次未来的排错马拉松。

把类型选型放进工程全流程看,它是成本最低的可靠性投资:选对类型只多写几个字符,选错类型的账单却以停机时数计价。下一节把零散的变量抱团成结构,数据设计从格子级进入容器级。

溢出与精度之外的第三类错误:类型混用的边角

除量程与精度,类型混用还有一类低频但恶毒的边角问题。一是隐式转换:整数与实数混算时平台按规则自动转换,除法先做整数除再做实数赋值,结果被悄悄截断——青线规矩是凡混合运算显式转换,让每一次类型跃迁都留有字据。二是符号位陷阱:把带符号整数当无符号用,数值一到三万二就翻脸成负数;反向把无符号当带符号存大数,读出来全是莫名负值。三是时间量参与算术:TIME加INT在某些平台可行、某些平台报错——可移植的写法是用标准的时间运算指令。三类问题的共性是编译器不拦或难拦,唯一可靠的防线是类型纪律加交叉评审。

顺带回应一个初学者高频问题:为什么不全用最大的类型?32位实数与64位整数看起来一劳永逸。代价有三——内存与带宽翻倍对扫描时间的累积影响、跨平台与上位系统的兼容性变量增多、以及最隐蔽的:全用大类型等于放弃"类型即文档"的表达力,读程序的人再也看不出设计者的量程意图。类型选型不是抠门,是把约束写进代码本身。

字符与枚举:两个特殊公民

基础类型里还有两位需要单独交代的成员。字符串类型在PLC里是"带长度头的字符数组",声明时要给最大长度——一个没设上限的字符串变量会在数据块里按平台默认值占位,几十个这种变量能悄悄吃掉可观的存储。青线的规矩:字符串只用于文本展示与批号传递,凡能用整数编号表达的(配方号、状态号、设备号)绝不存字符串——字符串比较慢、易错、还不能进快速比较逻辑。枚举是"有名字的整数":设备状态用枚举声明,代码里写STATE_FILLING而不是魔法数字三,编译器查错、人读得懂,这是2.4节软件模型在类型层的自然延伸。

日期时间类型也值得一提:DATE与TIME_OF_DAY分别承载日期与当日时刻,生产批次打点、班次切换判断都靠它们。用整数自算日期是初学者常干的傻事——闰年与月末会替你把bug埋进产线,标准类型早就处理好了这些边角。

选型评审的三个真实案例

把本节纪律放进三个真实评审场景,看它怎么运转。案例一:工程师把瓶体计数声明为INT,依据栏写"班产不到三万"。评审追问:总产量累计呢?——追溯逻辑要的是当月累计,INT必溢出,改UDINT。案例二:压力显示声明为REAL,另一位同事建议改成"放大十倍的整数"以避开浮点。评审判定:显示与运算回路都在用,REAL合理,累计与账面另有UDINT脉冲通道兜底——不必为REAL而REAL焦虑。案例三:某临时变量声明为BYTE存"当前工位号",看起来省内存,实际现代平台内存按块分配,BYTE与DINT的消耗差异可忽略,最终统一改INT——省错地方不如省心。

三个案例合起来的评审观:类型选择没有标准答案,只有"依据站不站得住"。数据字典里那一栏量程依据,就是让每个选择当面把自己的理由说出来。

本节要点回顾

  • 量程优先:类型按一生最大值选,计数类默认32位整数,升档成本几个字节,降档成本一次深夜故障;
  • REAL边界:可用于运算,不可用于累计与相等比较,账面量走整数或定标;
  • 量纲类型:时间与时刻用TIME族,把单位错误拦在编译期;
  • 登记纪律:每个变量的类型选择必须写出量程依据,写不出依据的选型不上线。

格子选好了,下一步把格子拼成柜子:结构体、数组与自定义类型。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U