在 SCL 中解析字符串(来自串行缓冲区)很简单:您可以使用命令:**
LEN
CONCAT
LEFT or RIGHT
MID
INSERT
DELETE
REPLACE
FIND
EQ_STRNG and NE_STRNG
GE_STRNG and LE_STRNG
GT_STRNG and LT_STRNG
INT_TO_STRING and
STRING_TO_INT
DINT_TO_STRING and
STRING_TO_DINT
REAL_TO_STRING and
STRING_TO_REAL
** 在此 SCL 备忘单上找到:http: //plc4good.org.ua/files/03_downloads/SCL_table/SCL-cheat-sheet.pdf
我会从..
- 在 SCL 中创建功能块。
- 将输入属性添加为字符串
- 将两个输出属性 (Temp1,Temp2) 添加为 Reals 或 Ints
- 几个静态变量,用于临时字符串和 text->real 转换。
解析您的代码类似于以下内容(因为我没有我的 TIA 门户,这可能需要修改):对于您的字符串“$AOPT_TEMP1_20_TEMP2_21”,假设开头始终是“$AOPT_TEMP1_”(12 个字符)
temp1_temp:=DELETE(IN1:=inputmsg,IN2:='$AOPT_TEMP1_',L:=12,P:=0);
//result should be "20_TEMP2_21"
//if you have a result above or below a 2 digit number we can't just get
//the next two chars in the string. so we use the FIND.
temp1_endpos:=FIND(IN1:=temp1_temp,IN2:='_');
temp1_str:=LEFT(IN1:temp1_temp,L:=temp1_endpos);
Temp1:=string_to_real(temp1_str);
//work off of the position of the temp1_endpos and the string stored in
//temp1_temp
temp2_str:=RIGHT(IN1:=temp1_temp,LEN(temp1_temp)-temp1_endpos-6);
//working from the right side of the string
// 20_TEMP2_21
// ^-------pos 2 temp2_ is another 6 so we subract another 6
// ^---pos 6
// len was (in this case) 11, we work from the right because we don't
// know how many digits each temp may be.
Temp2:=string_to_real(temp2_str);
请记住,这完全不在我的脑海中,并使用手册进行快速参考:
https://cache.industry.siemens.com/dl/files/465/36932465/att_106119/v1/s71200_system_manual_en-US_en-US。 pdf
有些事情可能需要调整。如果您不/不能使用 SCL,这些块也存在于梯形图中。如果可以的话,您可以仅在收到缓冲区后才执行此功能块。