最近一直在用SCL写程序,感觉SCL真是无所不能,遂开贴想和大家交流交流SCL使用中的一些体会、经验、代码,本人先抛砖引玉,放一些最近写的代码,望大家批评斧正,以利于共同提高。
=========PLC与上位机时间系统===========================
FUNCTION FC301 : VOID
TITLE = 'Block Title'
//
// DT类型数据的显示16进制转10进制.
//用于PLC时间系统
VERSION: '1.0'
AUTHOR: Author
NAME: chenm
FAMILY: Family
// Block Parameters
VAR_INPUT
// Input Parameters
IN:BYTE;
END_VAR
VAR_IN_OUT
// I/O Parameters
END_VAR
VAR_OUTPUT
// Output Parameters
OUT:BYTE;
END_VAR
VAR_TEMP
// Temporary Variables
TEMP2:DINT;
TEMP3:DINT;
X1:DINT;
X10:DINT;
END_VAR
TEMP2:=BYTE_TO_DINT(IN);
X10:=TEMP2/16;
X1:=TEMP2 MOD 16;
X10:=X10*10;
TEMP3:=X1+X10;
OUT:=DINT_TO_BYTE(TEMP3);
END_FUNCTION
FUNCTION FC302 : void
TITLE = 'Block Title'
//
// DT类型数据的显示10进制转16进制.
//用于PLC时间系统
VERSION: '1.0'
AUTHOR: Author
NAME: chenm
FAMILY: Family
// Block Parameters
VAR_INPUT
// Input Parameters
IN:BYTE;
END_VAR
VAR_IN_OUT
// I/O Parameters
END_VAR
VAR_OUTPUT
// Output Parameters
OUT:BYTE;
END_VAR
VAR_TEMP
// Temporary Variables
TEMP2:DINT;
TEMP3:DINT;
X1:DINT;
X10:DINT;
END_VAR
TEMP2:=BYTE_TO_DINT(IN);
X10:=TEMP2/10;
X1:=TEMP2 MOD 10;
X10:=X10*16;
TEMP3:=X1+X10;
OUT:=DINT_TO_BYTE(TEMP3);
;
END_FUNCTION
DATA_BLOCK DB500 FB500
//
//系统时间背景数据块..
//
BEGIN
END_DATA_BLOCK
FUNCTION_BLOCK FB500
TITLE = 'Block Title'
//
// 系统时间设定.
//上位机对时可采取2中方式:
//1:16进制数按年月日时分秒写到DBB0-DBB5,将FLAG16置1即可
//2:10进制数按年月日时分秒写到DBB32-DBB37,将FLAG10置1即可
VERSION: '1.0'
AUTHOR: Author
NAME: Name
FAMILY: Family
VAR_TEMP
// Temporary Variables
temp0:INT;
i:INT;
END_VAR
VAR
// Static Variables
ComputerDT:DATE_AND_TIME;//16进制上位机时间
PLC_DT:DATE_AND_TIME;//PLC时间
PLC_DATE:DATE;//PLC日期
PLC_TOD:TIME_OF_DAY;//
Flag16:BOOL;//16进制上位机对时标志,上位机时间数据区在0-7,16进制数
Flag10:BOOL;//10进制上位机对时标志,上位机时间数据区在32-39,10进制数
P10: BOOL;//上升沿
P16: BOOL;//上升沿
JQJ_DT:ARRAY[0..7]OF BYTE;//外设时间设定,10进制 年月日时分
PLC_DT_BYTE AT PLC_DT:ARRAY[0..7]OF BYTE;
ComputerDT_DEC:ARRAY[0..7]OF BYTE;//10进制上位机时间
ComputerDT_HEX:ARRAY[0..7]OF BYTE;//16进制上位机时间
ComputerDT10 AT ComputerDT_HEX:DATE_AND_TIME;
END_VAR
temp0:=SFC1(CDT:=PLC_DT);// READ_CLK
PLC_DATE:=FC6(IN:=PLC_DT);//DT_DATE
PLC_TOD:=FC8(IN:=PLC_DT);//DT_TOD
IF Flag16 AND NOT P16 THEN
temp0:=SET_CLK(PDT:=ComputerDT);
Flag16:=false;
END_IF;
P16:=Flag16;
IF Flag10 AND NOT P10 THEN
FOR i:= 0 TO 7 BY 1 DO
FC302(IN:=ComputerDT_DEC[i],OUT:=ComputerDT_HEX[i]);
END_FOR;
temp0:=SET_CLK(PDT:=ComputerDT10);
Flag10:=false;
END_IF;
P10:=Flag10;
FOR i:= 0 TO 7 BY 1 DO
FC301(IN:=PLC_DT_BYTE[i],OUT:=JQJ_DT[i]);
END_FOR;
END_FUNCTION_BLOCK