西门子PLC与Arduino之间的串行通信



我想使用西门子S7-1200与CM 1241 (RS-232)进行串行通信,并与我的Arduino进行通信。这是通信的设置。我有2个温度传感器和一个Led连接到我的Arduino,在PLC方面,我有西门子的S7-1200和CM-1241。Arduino和我的PLC只是通过使用Tx和Rx引脚连接,没有握手。

我正在将两个传感器的温度数据发送到PLC。在PLC方面,我决定何时打开连接到arduino的Led取决于不同的温度值。在发送数据之前,我已经为两个传感器分配了一个ID。这就是从Arduino传输的数据看起来像$AOPT_TEMP1_20_TEMP2_21。

到目前为止它很好,我正在使用RCV_PTP接收PLC上的串行数据(接收到的数据放在缓冲区上),并使用SEND_PTP发送数据。我还在PLC上实现了一个过滤器,它只接受以'$AOPT_'开头的串行数据。现在,我想从两个温度传感器TEMP1 &然后控制TEMP2的Led。例如,如果(TEMP1>TEMP2),则打开Led,否则关闭。

我能够从Arduino接收PLC上的数据,但现在我不知道如何进行比较接收到的信息。我如何从收到的缓冲区提取唯一需要的数据?如有任何建议,我将不胜感激。

Thanks in advance....

在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)作为实值或整数
  • 几个静态变量用于临时字符串和文本->实际转换。
解析你的代码类似于以下(因为我没有我的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这些块存在于梯子以及。如果可以的话,你可以只在收到缓冲区后才执行这个函数块。

相关内容

  • 没有找到相关文章

最新更新