发布于 2013-09-16 11:32:06
108楼
我编写的一个串口仪表的程序,解析及时序控制,写的不好,供大家参考。
FUNCTION_BLOCK FB61
// Block Parameters
VAR_INPUT
// Input Parameters
TGP_SEN:BOOL;
END_VAR
VAR_IN_OUT
// I/O Parameters
TGP_RcvData: ARRAY[0..15] OF BYTE;
END_VAR
VAR_OUTPUT
// Output Parameters
TGP_SendData: ARRAY[0..15] OF BYTE;
TGP_SendReq:BOOL;
TGP_SendReq_1Time:BOOL;
TGP_SendReq_ENQ:BOOL;
TGP_SendReq_PA1:BOOL;
TGP_SendLen:INT;
TGP_Status_CircuitA1:BYTE;
TGP_Status_CircuitA2:BYTE;
TGP_Status_CircuitB1:BYTE;
TGP_StatusA1:BYTE;
TGP_StatusA2:BYTE;
TGP_StatusB1:BYTE;
TGP_MeasureValueA1:REAL;
TGP_MeasureValueA2:REAL;
TGP_MeasureValueB1:REAL;
END_VAR
VAR_TEMP
// Temporary Variables
RcvLen:INT;
index:INT;
END_VAR
VAR
// Static Variables
TGP_SEN_Flag:BOOL:=FALSE;
RequestReadA1_Flag:BOOL:=FALSE;
ENQ_Flag:BOOL:=FALSE;
CycleSendTimer: SFB4;
TEMP_INT1:INT;
TEMP_REAL1:REAL;
TEMP_INT2:INT;
TEMP_REAL2:REAL;
TEMP_REAL3:REAL;
TEMP_INT3:INT;
TEMP_REAL4:REAL;
END_VAR
BEGIN
// Statement Section
IF TGP_SEN THEN
// Statement Section_IF
FOR index:= 0 TO 15 BY 1 DO
// Statement Section
TGP_RcvData[index]:=0;
END_FOR;
TGP_SEN_Flag:=FALSE;
TGP_SendData[0]:=B#16#53;
TGP_SendData[1]:=B#16#45;
TGP_SendData[2]:=B#16#4E;
TGP_SendData[3]:=B#16#2C;
TGP_SendData[4]:=B#16#33;
TGP_SendData[5]:=B#16#2C;
TGP_SendData[6]:=B#16#33;
TGP_SendData[7]:=B#16#2C;
TGP_SendData[8]:=B#16#31;
TGP_SendData[9]:=B#16#2C;
TGP_SendData[10]:=B#16#31;
TGP_SendData[11]:=B#16#0D;
TGP_SendData[12]:=B#16#0A;
TGP_SendLen:=13;
TGP_SendReq_1Time:=TRUE;
ELSE
TGP_SendReq_1Time:=FALSE;
END_IF;
IF TGP_RcvData[0]=16#06 AND (TGP_SendData[0]=16#53 OR TGP_SendData[0]=16#50) THEN
// Statement Section_IF
FOR index:= 0 TO 15 BY 1 DO
// Statement Section
TGP_RcvData[index]:=0;
END_FOR;
TGP_SendData[0]:=B#16#05;
TGP_SendLen:=1;
TGP_SendReq_ENQ:=TRUE;
ENQ_Flag:=TRUE;
ELSE
TGP_SendReq_ENQ:=FALSE;
END_IF;
IF TGP_RcvData[0]=16#33 AND TGP_SendData[0]=16#05 THEN
// Statement Section_IF
TGP_Status_CircuitA1:=TGP_RcvData[0];
TGP_Status_CircuitA2:=TGP_RcvData[2];
TGP_Status_CircuitB1:=TGP_RcvData[4];
TGP_SEN_Flag:=TRUE;
RequestReadA1_Flag:=FALSE;
ENQ_Flag:=FALSE;
END_IF;
// TON.DBxxx(IN := // IN: BOOL
// ,PT := // IN: TIME
// );
// := DBxxx.Q; // OUT: BOOL
// := DBxxx.ET; // OUT: TIME
CycleSendTimer(IN:=TGP_SEN_Flag AND NOT RequestReadA1_Flag ,PT:=T#2000MS);
IF TGP_SEN_Flag AND CycleSendTimer.Q AND NOT RequestReadA1_Flag THEN
FOR index:= 0 TO 15 BY 1 DO
// Statement Section
TGP_RcvData[index]:=0;
END_FOR;
TGP_SendData[0]:=B#16#50;//reqest for reading pressure measuring circuit A1
TGP_SendData[1]:=B#16#41;
TGP_SendData[2]:=B#16#32;
TGP_SendData[3]:=B#16#0D;
TGP_SendData[4]:=B#16#0A;
TGP_SendLen:=5;
TGP_SendReq_PA1:=TRUE;
RequestReadA1_Flag:=TRUE;
ELSE
TGP_SendReq_PA1:=FALSE;
END_IF;
IF TGP_RcvData[5]=16#45 AND TGP_SendData[1]=16#41 AND TGP_SendData[2]=16#32 THEN
// Statement Section_IF
TGP_StatusA2:=TGP_RcvData[0];
IF TGP_RcvData[9]=16#0D THEN
RcvLen:=11;
ELSE
RcvLen:=10;
END_IF;
IF RcvLen=11 THEN
IF TGP_RcvData[6]= 16#2D THEN
TGP_MeasureValueA1:=(INT_TO_REAL(BYTE_TO_INT(TGP_RcvData[2])-48)+INT_TO_REAL(BYTE_TO_INT(TGP_RcvData[4])-48)*0.1)/EXPD((BYTE_TO_INT(TGP_RcvData[7])-48)*10 +(BYTE_TO_INT(TGP_RcvData[8])-48));
ELSIF TGP_RcvData[6]= 16#2B THEN
TGP_MeasureValueA1:=(INT_TO_REAL(BYTE_TO_INT(TGP_RcvData[2])-48)+INT_TO_REAL(BYTE_TO_INT(TGP_RcvData[4])-48)*0.1)*EXPD((BYTE_TO_INT(TGP_RcvData[7])-48)*10 +(BYTE_TO_INT(TGP_RcvData[8])-48));
END_IF;
ELSIF RcvLen=10 THEN
IF TGP_RcvData[6]= 16#2D THEN
TGP_MeasureValueA1:=(INT_TO_REAL(BYTE_TO_INT(TGP_RcvData[2])-48)+INT_TO_REAL(BYTE_TO_INT(TGP_RcvData[4])-48)*0.1)/EXPD(BYTE_TO_INT(TGP_RcvData[7])-48);
ELSIF TGP_RcvData[6]= 16#2B THEN
TGP_MeasureValueA1:=(INT_TO_REAL(BYTE_TO_INT(TGP_RcvData[2])-48)+INT_TO_REAL(BYTE_TO_INT(TGP_RcvData[4])-48)*0.1)*EXPD(BYTE_TO_INT(TGP_RcvData[7])-48);
TEMP_INT1:=BYTE_TO_INT(TGP_RcvData[2])-48;
TEMP_REAL1:=INT_TO_REAL(BYTE_TO_INT(TGP_RcvData[2])-48);
TEMP_INT2:=BYTE_TO_INT(TGP_RcvData[4])-48;
TEMP_REAL2:=INT_TO_REAL(BYTE_TO_INT(TGP_RcvData[4])-48);
TEMP_REAL3:=INT_TO_REAL(BYTE_TO_INT(TGP_RcvData[4])-48)*0.1;
TEMP_INT3:=BYTE_TO_INT(TGP_RcvData[7])-48;
TEMP_REAL4:=EXPD(BYTE_TO_INT(TGP_RcvData[7])-48);
END_IF;
END_IF;
RequestReadA1_Flag:=FALSE;
ENQ_Flag:=FALSE;
END_IF;
END_FUNCTION_BLOCK