指令概述
S7-1200有兩套點對點通信指令,如圖1所示。

圖1 指令列表
上述兩套指令集區別如下表:
| 指令集 | 適用范圍 | |
|---|---|---|
| PtP Communication | S7-1200中央機架 | CPU版本>=V4.1.1,CM1241版本>=V2.1, TIA PORTAL 版本>=V13SP1,CB1241沒有版本要求 |
| 分布式IO | CPU版本>=V4.1.1,ET200SP/ET200MP分布式IO的串口模塊 | |
| 點到點 | S7-1200中央機架 | CPU、TIA PORTAL、CM1241、CB1241 均沒有版本限制 |
建議使用PtP Communication指令集的指令,因為指令和S7-1500兼容,并且指令版本一直在更新,點到點指令集不再更新,建議只用于老項目升級。
指令說明
對于如圖2中的指令,這些是用于在線修改串口模塊硬件組態的指令,例如在線修改波特率,在線修改接收條件。一般不需要使用,具體使用可以參見TIA PORTAL幫助或者S7-1200系統手冊。

圖2 組態指令
對于如圖3中的指令,這些是用于硬流控操作的指令,通過信號設置激活相關的接收發送。除非使用硬流控,否則不需要使用,具體使用可以參見TIA PORTAL幫助或者S7-1200系統手冊。

圖3 流控指令
對于如圖4中的指令,這些是用于實現一些擴展功能的指令,例如與第三方設備非標準MODBUS通信,伙伴不需要CRC校驗,可以使用該指令禁用MODBUS CRC。
一般不需要使用,具體使用可以參見TIA PORTAL幫助或者S7-1200系統手冊。

圖4 擴展功能
對于如圖5中的指令,這些是用于清除通信模塊接收緩沖區的指令。

圖5 清除緩沖區
對于一般情況下的自由口通信,都是只使用如圖6中的發送接收指令。

圖6 發送接收

圖7 發送指令
| Send_P2P | SEND_PTP | |
|---|---|---|
| EN | 使能,建議常接通 | |
| REQ | 發送觸發信號,使用沿觸發 | |
| PORT | 串口硬件模塊標識符,可以在PLC變量表中找到,如圖9所示 | |
| BUFFER | 發送區,一般使用P#指針形式,String類型或者WString類型,字符數組等,如果使用String類型或者WString類型,則伙伴方收到時不會看到字符串前面的最大長度和實際長度,也就是說相當于發送的是字符數組。 | |
| LENGTH | 實際發送的字節數,如果為0,則是全部發送 | |
| PCTRL | - | 沒有意義 |
| DONE | 將數據發送至通信模塊發送緩沖區完成,將有一個掃描周期置位 | |
| ERROR | 發送錯誤,將有一個掃描周期置位 | |
| STATUS | 通常顯示狀態代碼,錯誤時會在ERROR為1的周期顯示錯誤信息(16#8xxx) | |

圖8 接收指令
| Receive_P2P | RCV_PTP | |
|---|---|---|
| EN | 為True時,如果通信模塊接收緩沖區有數據,則將其傳送至BUFFER | 使能,建議常接通 |
| EN_R | - | 為True時,如果通信模塊接收緩沖區有數據,則將其傳送至BUFFER |
| PORT | 串口硬件模塊標識符,可以在PLC變量表中找到,如圖9所示 | |
| BUFFER | 接收區,一般使用P#指針形式,String類型或者WString類型,字符數組等,如果使用String類型或者WString類型,則即使伙伴方發送的是字符數組,指令也會為字符數組添加最大長度和實際長度成為字符串。 | |
| NDR | 將通信模塊接收緩沖區的數據接收至BUFFER完成,將有一個掃描周期置位 |
如果EN_R為True時,則將通信模塊接收緩沖區的數據接收至BUFFER完成,將有一個掃描周期置位 如果EN_R為False,則通信模塊接收緩沖區有數據時NDR將始終為True |
| ERROR | 指令錯誤,將有一個掃描周期置位 | |
| STATUS | 通常顯示狀態代碼,錯誤時會在ERROR為1的周期顯示錯誤信息(16#8xxx) | |
| LENGTH | 在接收完成時,將有一個掃描周期顯示接收到的字節數 | |
如果通信模塊接收緩沖區包含有n次接收到的數據,則需要Receive_P2P EN/RCV_PTP EN_R n個掃描周期為True才能接收至BUFFER完成。
一般建議Receive_P2P EN/RCV_PTP EN_R常通或者接通一段時間而不是使用沿觸發,這樣通信模塊接收緩沖區一旦接收到新數據,就可以立即接收至BUFFER。
如果可能,可以把接收指令放在循環OB內盡可能快的調用。

圖9 系統常量
①在CPU中選擇PLC變量表>默認變量表
②選擇系統常量
③找到相關串口模塊,建議直接將模塊名稱復制到PORT處
發送指令、發送完成位、發送錯誤位、發送錯誤代碼
下面分為點對點指令與PtP Communication 指令分別介紹

圖10 點到點發送相關指令

圖10 PtP Communication 發送相關指令
程序段1:觸發發送
程序段2:發送完成位觸發一個全局變量自加一,每完成一次該變量加一個數,可以通過這種方法檢測是否發送完成
程序段3:發送錯誤位觸發一個MOVE指令,當發送錯誤到來時,通過這種方法將STATUS的變量移動到一個全Word類型全局變量,發送錯誤代碼將保存到該變量中
接收指令、接收完成位、接收錯誤位、接收錯誤代碼、接收長度
下面分為點對點指令與PtP Communication 指令分別介紹

圖12 點到點接收相關指令

圖13 PtP Communication 接收相關指令
程序段4:觸發接收
程序段5:接收完成位觸發一個全局變量自加一,每完成一次該變量加一個數,可以通過這種方法檢測是否接收完成,同時將長度變量通過一個MOVE指令移動到一個UInt類型全局變量,接收長度將保存到該變量中
程序段6:接收錯誤位觸發一個MOVE指令,接收送錯誤到來時,通過這種方法將STATUS的變量移動到一個Word類型全局變量,接收錯誤代碼將保存到該變量中
輪詢編程
通信任務:
1號站S7-1200使用CB1241,利用點對點指令發送接收。
2號站S7-1200使用ET200SP分布式IO的CMPTP模塊,利用PtP Communication 指令發送接收。
1號站發送字符串'西門子',2號站發送字符串'博大精深'。
注:例子中1號站先發送,2號站先接收,實際取決于需要,對于PLC來說,先發送還是先接收都是可以的。
例子中使用系統存儲器FirstScan,激活方式如圖14所示。

圖14 設置系統存儲器
①進入CPU的設備視圖
②在屬性>常規下選中系統和時鐘存儲器
③激活啟用系統存儲器字節,默認MB1
④即為FirstScan變量,默認M1.0
圖15為1號站輪詢:

圖15 1號站輪詢
①使用系統存儲器“FirstScan”激活第一次的發送
②發送DONE位置位接收請求,復位發送請求
③觸發接收
④接收NDR位置位發送請求,復位接收請求
⑤觸發下一次的發送
圖16為2號站輪詢:

圖16 2號站輪詢
①使用系統存儲器“FirstScan”激活第一次的接收
②接收NDR位的上升沿置位接收請求,復位發送請求
③觸發發送
④發送DONE位置位接收請求,復位發送請求
⑤觸發下一次的接收
通信結果:

圖17 通信結果
常見問題
如何處理對于字符串、字符數組等的發送接收?
考慮到PLC通常與第三方進行自由口通信,而通信內容通常是字符串,但是西門子的SIMATIC String或者WString是包含最大長度與實際長度的,而第三方的字符串對于西門子來說是Char數組或者WChar數組。
基于此點對點及PtP Communication 指令集均對字符串、字符數組的發送接收進行了優化,即:
第三方伙伴發送字符數組,PLC的接收指令BUFFER類型為字符數組,則接收成字符數組,BUFFER類型為字符串,則接收成字符串,接收指令自動將字符串的最大長度和實際長度補齊。
第三方伙伴接收字符數組,PLC的發送指令BUFFER類型為字符數組,則發送字符數組,BUFFER類型為字符串,同樣發送字符數組,發送指令自動將字符串的最大長度和實際長度去掉。
簡單的說PLC會按照字符數組的形式收發,發送或者接收BUFFER如果是字符串,則會進行相應的轉換。以上面輪詢為例,參見圖18圖19。

圖18 修改2號站的發送接收區的String類型改為Char數組

圖19 收發結果
可以得知,1號站發送字符串‘123’,2號站接收到字符數組,每個字符分別是'1'、'2'、'3'。2號站發送字符數組,每個字符分別是'a'、'b'、'c',1號站接收到字符串為'abc'。
審核編輯:劉清
-
plc
+關注
關注
5051文章
14594瀏覽量
486918 -
串口通信
+關注
關注
34文章
1662瀏覽量
57971 -
S7-1200
+關注
關注
11文章
335瀏覽量
19545
原文標題:西門子PLC串口通信編程
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
如何使用博途平臺上完成西門子的S7-1500與S7-1200以太網通信?
西門子S7-1200的TCP通信配置過程及數據交換方式
西門子S7-1200與組態軟件之間無線MODBUS通信實例
西門子S7-1200通信指令概述
評論