quote:以下是引用n次看你的背影在2011-11-04 14:12:48的发言:
关于“如何编写出可读性强的程序、以使别人更快的读懂你的程序?”我想说说我的做法和体会:
1、设计符号:给设备分配好I/O点的地址后,把它们的地址按照从小到大的次序写到Excel表里面,并做好与之对应的符号和中文注释;I/O地址的符号一般由设备位号和能代表该点含义的英文缩写的大写字母这两部分组成:比如有一设备上的电机位号为66666,我会定义它的备妥(ready)信号的符号为66666RDY、中控(center)信号的符号为66666CNT、运行反馈(feedback)信号的符号为66666FBK、报警(alarm)信号的符号为66666ALM、故障(fault)信号的符号为66666FLT、确认(acknowledge)信号的符号为66666ACK、全开限位(open position)信号的符号为66666OPS、全关限位(close position)信号的符号为66666CPS、驱动(drive)信号的符号为66666DRV;???????比如这台电机有2个轴承温度测点,我会定义它实际(actual)PIW输入地址的符号为T66666ACT1、T66666ACT2......I/O地址的符号和注释定义好以后导入符号表。编程时甚至可以不需要知道绝对地址只要知道位号或对象就可以直接使用符号编程。PLC其它被用到的全局变量,如:位存储器M、定时器T、计数器C、数据块DB......也要尽量做好符号和注释。有规律、有含义的变量符号命名和详细的注释,可以增强程序的可读性。同时一个好的全局符号系统可以面向对象进行编程。而且对变量的查找也非常有帮助,例如这台电机有故障发生,那么在程序编辑器鼠标右键快捷方式Go To/Go To Location输入66666FLT然后Go To,程序编辑器就能跳转到"66666FLT"程序中赋值的地方,就可以很快查明故障原因了,良好的符号系统也能快速诊断设备状态。
2、编程的语言:编程时逻辑不复杂的,尽量使用大家比较熟悉的LAD、FBD语言来实现;在主程序、子程序中调用FC、FB时,尽量用LAD、FBD语言方式,这样程序比较直观、可读性也强。
3、程序的注释:注释可以用英文也可以用中文,国内客户的程序尽量用中文做注释。编程时尽量做好语句的注释、段落的注释、块的注释;用户自己开发的FC、FB,在它的对象属性里面可以将其输入、输出形参以及其功能尽量描述的详细一点,这样其它人在看程序时也就比较容易理解。
4、主程序的架构:在较大的系统中,某些特定功能的程序可以人为地分割开来。这样也就会更加清晰易懂。贴一主程序架构规划的例子参考。
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬OB1内的用户程序╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
// ★★★PLC与PLC或者和从站设备的通信程序★★★
CALL FC 301 //接受来自PLC2的数据 shared db DB301
CALL FC 302 //发送数据到PLC2 shared db DB302
CALL FC 303 //接受来自PLC3的数据 shared db DB303
CALL FC 304 //发送数据到PLC3 shared db DB304
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬XX生产线PLC1的控制程序╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
// ★★★各工艺段的控制程序★★★
CALL FC 311 //工艺段1的控制程序 shared db DB311
CALL FC 312 //工艺段2的控制程序 shared db DB312
CALL FC 313 //工艺段3的控制程序 shared db DB313
CALL FC 314 //工艺段4的控制程序 shared db DB314
CALL FC 315 //工艺段5的控制程序 shared db DB315
。
。
。
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬可放入OB3X内执行╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
// ★★★各模拟量处理程序★★★
CALL FC 361 //模拟量地址从PIW512~PIW575(每个群组32个模拟量)shared db DB361
CALL FC 362 //模拟量地址从PIW576~PIW639(每个群组32个模拟量)shared db DB362
CALL FC 363 //模拟量地址从PIW640~PIW703(每个群组32个模拟量)shared db DB363
CALL FC 364 //模拟量地址从PIW704~PIW767(每个群组32个模拟量)shared db DB364
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬可放入OB3X内执行╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
// ★★★STEP型PID控制程序★★★
CALL FC 381 //每个群组控制16个回路STEP型PID控制器 shared db DB381
// ★★★连续PID控制程序★★★
CALL FC 385 //每个群组控制16个回路连续量的PID控制器 shared db DB385
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
// ★★★评估CPU执行PLC程序的时间以及PID程序初始化标志位复位★★★
L #OB1_PREV_CYCLE //Cycle time of previous OB1 scan (milliseconds)
T DB300.DBW 0
L #OB1_MIN_CYCLE //Minimum cycle time of OB1 (milliseconds)
T DB300.DBW 2
L #OB1_MAX_CYCLE //Maximum cycle time of OB1 (milliseconds)
T DB300.DBW 4
A M 17.0
R M 17.0 //OB1第一个循环结束复位初始化标志位,用作PID控制器初始化
BE
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
一个清晰的可扩展的程序架构,也能让人快速读懂程序!
一个较好的程序架构也有利于系统的扩展:比如生产线需要增加一工艺过程,可以拷贝一个FC315和DB315,重命名为FC316和DB316,修改一下FC316里面的相应的子程序的实参和逻辑联锁关系,这样在较短的时间之内一个工艺段程序就出来了。同种属性的、相同结构的子程序拷贝一下,然后修改一下实参和逻辑,问题会变得相对容易一些。如果这条生产线比较大,或者有几条这样的生产线,需要较多这样的PLC站,那么拷贝这样PLC站的程序,同样修改相应的实参和逻辑联锁关系,并做好与伙伴PLC和从站需要的通讯,就能将较多的PLC站集成在一起!主程序架构具有能伸能缩、可进可退、收放自如的功能和特点,也就能够满足较多行业和场合的需求了!可见,较好的思想会让我们走的更远!有些高级语言程序的架构思想确实在PLC里面也值得借鉴!比如C语言。
5、帮助文件:如果编程者细致,并希望别人能快速看懂程序(值得尊敬的编程者),也会给自己开发的FC、FB做些帮助文件,或者也可以将帮助文件加入进S7的help里面去。
个人体会、个人愚见,仅供参考!