首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >西门子PLC与Arduino的串行通信

西门子PLC与Arduino的串行通信
EN

Stack Overflow用户
提问于 2015-09-06 21:23:00
回答 1查看 4.9K关注 0票数 3

我想使用西门子S7-1200与CM 1241 (RS-232)进行串行通信,并与我的Arduino通信。以下是通信的设置。我有两个温度传感器和一个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上的数据,但是现在我不知道如何比较接收到的信息。如何从接收到的缓冲区中提取唯一需要的数据?如有任何建议,将不胜感激。

提前谢谢..。

EN

回答 1

Stack Overflow用户

发布于 2015-09-15 09:49:40

在SCL中解析字符串(从串行缓冲区)很简单:您可以使用命令:**

代码语言:javascript
运行
复制
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备忘单上找到:table/SCL-cheat-sheet.pdf

我会从..。

  • 在SCL中创建函数块。
  • 将输入属性添加为字符串
  • 添加两个输出属性(Temp1、Temp2)作为Reals或Ints
  • 用于临时字符串和文本->实际转换的几个静态变量。

解析代码,类似于以下内容(因为我没有TIA门户,这可能需要修改):对于字符串"$AOPT_TEMP1_20_TEMP2_21“,假设开头总是"$AOPT_TEMP1_”(12个字符)

代码语言:javascript
运行
复制
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);  

请记住,这都是我的头绪,并使用手册进行快速参考:en-US.pdf

有些东西可能需要调整。如果您不能/不能使用SCL,这些块也存在于梯子中。如果可以的话,您只需在收到缓冲区后才能将此函数块连接起来执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32428430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档