串口通信編程
指令概述
S7-1200有兩套點(diǎn)對(duì)點(diǎn)通信指令,如圖1所示。
圖1 指令列表
上述兩套指令集區(qū)別如下表:
指令集 | 適用范圍 | |
---|---|---|
PtP Communication | S7-1200中央機(jī)架 | CPU版本>=V4.1.1,CM1241版本>=V2.1, TIA PORTAL 版本>=V13SP1,CB1241沒有版本要求 |
分布式IO | CPU版本>=V4.1.1,ET200SP/ET200MP分布式IO的串口模塊 | |
點(diǎn)到點(diǎn) | S7-1200中央機(jī)架 | CPU、TIA PORTAL、CM1241、CB1241 均沒有版本限制 |
建議使用PtP Communication指令集的指令,因?yàn)橹噶詈蚐7-1500兼容,并且指令版本一直在更新,點(diǎn)到點(diǎn)指令集不再更新,建議只用于老項(xiàng)目升級(jí)。
指令說明
對(duì)于如圖2中的指令,這些是用于在線修改串口模塊硬件組態(tài)的指令,例如在線修改波特率,在線修改接收條件。一般不需要使用,具體使用可以參見TIA PORTAL幫助或者S7-1200系統(tǒng)手冊(cè)。
圖2 組態(tài)指令
對(duì)于如圖3中的指令,這些是用于硬流控操作的指令,通過信號(hào)設(shè)置激活相關(guān)的接收發(fā)送。除非使用硬流控,否則不需要使用,具體使用可以參見TIA PORTAL幫助或者S7-1200系統(tǒng)手冊(cè)。
圖3 流控指令
對(duì)于如圖4中的指令,這些是用于實(shí)現(xiàn)一些擴(kuò)展功能的指令,例如與第三方設(shè)備非標(biāo)準(zhǔn)MODBUS通信,伙伴不需要CRC校驗(yàn),可以使用該指令禁用MODBUS CRC。一般不需要使用,具體使用可以參見TIA PORTAL幫助或者S7-1200系統(tǒng)手冊(cè)。
圖4 擴(kuò)展功能
對(duì)于如圖5中的指令,這些是用于清除通信模塊接收緩沖區(qū)的指令。
圖5 清除緩沖區(qū)
對(duì)于一般情況下的自由口通信,都是只使用如圖6中的發(fā)送接收指令。
圖6 發(fā)送接收
圖7 發(fā)送指令
Send_P2P | SEND_PTP | |
---|---|---|
EN | 使能,建議常接通 | |
REQ | 發(fā)送觸發(fā)信號(hào),使用沿觸發(fā) | |
PORT | 串口硬件模塊標(biāo)識(shí)符,可以在PLC變量表中找到,如圖9所示 | |
BUFFER | 發(fā)送區(qū),一般使用P#指針形式,String類型或者WString類型,字符數(shù)組等,如果使用String類型或者WString類型,則伙伴方收到時(shí)不會(huì)看到字符串前面的最大長(zhǎng)度和實(shí)際長(zhǎng)度,也就是說相當(dāng)于發(fā)送的是字符數(shù)組。 | |
LENGTH | 實(shí)際發(fā)送的字節(jié)數(shù),如果為0,則是全部發(fā)送 | |
PCTRL | - | 沒有意義 |
DONE | 將數(shù)據(jù)發(fā)送至通信模塊發(fā)送緩沖區(qū)完成,將有一個(gè)掃描周期置位 | |
ERROR | 發(fā)送錯(cuò)誤,將有一個(gè)掃描周期置位 | |
STATUS | 通常顯示狀態(tài)代碼,錯(cuò)誤時(shí)會(huì)在ERROR為1的周期顯示錯(cuò)誤信息(16#8xxx) |
圖8 接收指令
Receive_P2P | RCV_PTP | |
---|---|---|
EN | 為True時(shí),如果通信模塊接收緩沖區(qū)有數(shù)據(jù),則將其傳送至BUFFER | 使能,建議常接通 |
EN_R | - | 為True時(shí),如果通信模塊接收緩沖區(qū)有數(shù)據(jù),則將其傳送至BUFFER |
PORT | 串口硬件模塊標(biāo)識(shí)符,可以在PLC變量表中找到,如圖9所示 | |
BUFFER | 接收區(qū),一般使用P#指針形式,String類型或者WString類型,字符數(shù)組等,如果使用String類型或者WString類型,則即使伙伴方發(fā)送的是字符數(shù)組,指令也會(huì)為字符數(shù)組添加最大長(zhǎng)度和實(shí)際長(zhǎng)度成為字符串。 | |
NDR | 將通信模塊接收緩沖區(qū)的數(shù)據(jù)接收至BUFFER完成,將有一個(gè)掃描周期置位 |
如果EN_R為True時(shí),則將通信模塊接收緩沖區(qū)的數(shù)據(jù)接收至BUFFER完成,將有一個(gè)掃描周期置位 |
ERROR | 指令錯(cuò)誤,將有一個(gè)掃描周期置位 | |
STATUS | 通常顯示狀態(tài)代碼,錯(cuò)誤時(shí)會(huì)在ERROR為1的周期顯示錯(cuò)誤信息(16#8xxx) | |
LENGTH | 在接收完成時(shí),將有一個(gè)掃描周期顯示接收到的字節(jié)數(shù) |
如果通信模塊接收緩沖區(qū)包含有n次接收到的數(shù)據(jù),則需要Receive_P2P EN/RCV_PTP EN_R n個(gè)掃描周期為True才能接收至BUFFER完成。
一般建議Receive_P2P EN/RCV_PTP EN_R常通或者接通一段時(shí)間而不是使用沿觸發(fā),這樣通信模塊接收緩沖區(qū)一旦接收到新數(shù)據(jù),就可以立即接收至BUFFER。如果可能,可以把接收指令放在循環(huán)OB內(nèi)盡可能快的調(diào)用。
圖9 系統(tǒng)常量
①在CPU中選擇PLC變量表>默認(rèn)變量表
②選擇系統(tǒng)常量
③找到相關(guān)串口模塊,建議直接將模塊名稱復(fù)制到PORT處
發(fā)送指令、發(fā)送完成位、發(fā)送錯(cuò)誤位、發(fā)送錯(cuò)誤代碼
下面分為點(diǎn)對(duì)點(diǎn)指令與PtP Communication 指令分別介紹
圖10 點(diǎn)到點(diǎn)發(fā)送相關(guān)指令
圖10 PtP Communication 發(fā)送相關(guān)指令
程序段1:觸發(fā)發(fā)送
程序段2:發(fā)送完成位觸發(fā)一個(gè)全局變量自加一,每完成一次該變量加一個(gè)數(shù),可以通過這種方法檢測(cè)是否發(fā)送完成
程序段3:發(fā)送錯(cuò)誤位觸發(fā)一個(gè)MOVE指令,當(dāng)發(fā)送錯(cuò)誤到來時(shí),通過這種方法將STATUS的變量移動(dòng)到一個(gè)全Word類型全局變量,發(fā)送錯(cuò)誤代碼將保存到該變量中
接收指令、接收完成位、接收錯(cuò)誤位、接收錯(cuò)誤代碼、接收長(zhǎng)度
下面分為點(diǎn)對(duì)點(diǎn)指令與PtP Communication 指令分別介紹
圖12 點(diǎn)到點(diǎn)接收相關(guān)指令
圖13 PtP Communication 接收相關(guān)指令
程序段4:觸發(fā)接收
程序段5:接收完成位觸發(fā)一個(gè)全局變量自加一,每完成一次該變量加一個(gè)數(shù),可以通過這種方法檢測(cè)是否接收完成,同時(shí)將長(zhǎng)度變量通過一個(gè)MOVE指令移動(dòng)到一個(gè)UInt類型全局變量,接收長(zhǎng)度將保存到該變量中
程序段6:接收錯(cuò)誤位觸發(fā)一個(gè)MOVE指令,接收送錯(cuò)誤到來時(shí),通過這種方法將STATUS的變量移動(dòng)到一個(gè)Word類型全局變量,接收錯(cuò)誤代碼將保存到該變量中
輪詢編程
通信任務(wù):
1號(hào)站S7-1200使用CB1241,利用點(diǎn)對(duì)點(diǎn)指令發(fā)送接收。
2號(hào)站S7-1200使用ET200SP分布式IO的CMPTP模塊,利用PtP Communication 指令發(fā)送接收。
1號(hào)站發(fā)送字符串'西門子',2號(hào)站發(fā)送字符串'博大精深'。
注:例子中1號(hào)站先發(fā)送,2號(hào)站先接收,實(shí)際取決于需要,對(duì)于PLC來說,先發(fā)送還是先接收都是可以的。
例子中使用系統(tǒng)存儲(chǔ)器FirstScan,激活方式如圖14所示。
圖14 設(shè)置系統(tǒng)存儲(chǔ)器
①進(jìn)入CPU的設(shè)備視圖
②在屬性>常規(guī)下選中系統(tǒng)和時(shí)鐘存儲(chǔ)器
③激活啟用系統(tǒng)存儲(chǔ)器字節(jié),默認(rèn)MB1
④即為FirstScan變量,默認(rèn)M1.0
圖15為1號(hào)站輪詢:
圖15 1號(hào)站輪詢
①使用系統(tǒng)存儲(chǔ)器“FirstScan”激活第一次的發(fā)送
②發(fā)送DONE位置位接收請(qǐng)求,復(fù)位發(fā)送請(qǐng)求
③觸發(fā)接收
④接收NDR位置位發(fā)送請(qǐng)求,復(fù)位接收請(qǐng)求
⑤觸發(fā)下一次的發(fā)送
圖16為2號(hào)站輪詢:
圖16 2號(hào)站輪詢
①使用系統(tǒng)存儲(chǔ)器“FirstScan”激活第一次的接收
②接收NDR位的上升沿置位接收請(qǐng)求,復(fù)位發(fā)送請(qǐng)求
③觸發(fā)發(fā)送
④發(fā)送DONE位置位接收請(qǐng)求,復(fù)位發(fā)送請(qǐng)求
⑤觸發(fā)下一次的接收
通信結(jié)果:
圖17 通信結(jié)果
常見問題
如何處理對(duì)于字符串、字符數(shù)組等的發(fā)送接收?
考慮到PLC通常與第三方進(jìn)行自由口通信,而通信內(nèi)容通常是字符串,但是西門子的SIMATIC String或者WString是包含最大長(zhǎng)度與實(shí)際長(zhǎng)度的,而第三方的字符串對(duì)于西門子來說是Char數(shù)組或者WChar數(shù)組。
基于此點(diǎn)對(duì)點(diǎn)及PtP Communication 指令集均對(duì)字符串、字符數(shù)組的發(fā)送接收進(jìn)行了優(yōu)化,即:
第三方伙伴發(fā)送字符數(shù)組,PLC的接收指令BUFFER類型為字符數(shù)組,則接收成字符數(shù)組,BUFFER類型為字符串,則接收成字符串,接收指令自動(dòng)將字符串的最大長(zhǎng)度和實(shí)際長(zhǎng)度補(bǔ)齊。
第三方伙伴接收字符數(shù)組,PLC的發(fā)送指令BUFFER類型為字符數(shù)組,則發(fā)送字符數(shù)組,BUFFER類型為字符串,同樣發(fā)送字符數(shù)組,發(fā)送指令自動(dòng)將字符串的最大長(zhǎng)度和實(shí)際長(zhǎng)度去掉。
簡(jiǎn)單的說PLC會(huì)按照字符數(shù)組的形式收發(fā),發(fā)送或者接收BUFFER如果是字符串,則會(huì)進(jìn)行相應(yīng)的轉(zhuǎn)換。以上面輪詢?yōu)槔瑓⒁妶D18圖19。
圖18 修改2號(hào)站的發(fā)送接收區(qū)的String類型改為Char數(shù)組
圖19 收發(fā)結(jié)果
可以得知,1號(hào)站發(fā)送字符串‘123’,2號(hào)站接收到字符數(shù)組,每個(gè)字符分別是'1'、'2'、'3'。2號(hào)站發(fā)送字符數(shù)組,每個(gè)字符分別是'a'、'b'、'c',1號(hào)站接收到字符串為'abc'。
審核編輯 :李倩
-
編程
+關(guān)注
關(guān)注
88文章
3596瀏覽量
93610 -
串口通信
+關(guān)注
關(guān)注
34文章
1620瀏覽量
55428 -
S7-1200
+關(guān)注
關(guān)注
11文章
331瀏覽量
17922
原文標(biāo)題:串口通信編程
文章出處:【微信號(hào):gh_a8b121171b08,微信公眾號(hào):機(jī)器人及PLC自動(dòng)化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論