MODBUS通訊----PLC S7-200 與變頻器的通訊
在與英威騰(INVT)變頻器Modbus通訊時,採用自己編制主站通訊程式,參照西門子USS程式格式做成庫程式,在多個專案上應用,效果還是不錯。
S7-200自由口通訊確實很自由,可以編制任何通訊。
西門子自帶的Modbus主站程式,用在變頻器控制上,不方便。要求是能向USS庫程式一樣有多個控制的位訊號輸入,在速度設定值變化是傳送速度值,平時要讀變頻器的執行狀態(包括故障狀態),還想讀變頻器執行時的電流。於是,自己根據英威騰變頻器的通訊協議,編制了Modbus主站通訊程式。
Modbus通訊協議要求:
讀寫都是8個位元組,只是功能碼的不同和讀是讀得長度,寫是寫的資料值
傳送 |
VB1600 |
VB1601 |
VB1602 |
VB1603 |
VB1604 |
VB1605 |
VB1606 |
VB1607 |
VB1608 |
8個位元組 |
傳送長度8 |
從站地址 |
功能碼 |
資料地址高位元組 |
資料地址低位元組 |
資料字長高位元組 |
資料字長低位元組 |
CRC校驗低位元組 |
CRC校驗高位元組 |
從上面的通訊結構可以看出:資料地址、字長和CRC都是一個字,其中地址和長度或資料高低位元組與西門子定義一致,即低地址高位元組。CRC不一樣,是低地址低位元組,與計算機上的定義一致。這點必需注意。
變頻器寫返回:
接受 |
VB1609 |
VB1610 |
VB1611 |
VB1612 |
VB1613 |
VB1614 |
VB1615 |
VB1616 |
VB1617 |
8個位元組 |
接受長度8 |
從站地址 |
功能碼 |
資料地址高位元組 |
資料地址低位元組 |
資料值 高位元組 |
資料值 低位元組 |
CRC校驗低位元組 |
CRC校驗高位元組 |
返回與傳送時一樣,表示通訊資料接受成功,並已執行。
我只需讀5個字的引數或1個字的狀態,變頻器讀返回:
接受 |
VB1609 |
VB1610 |
VB1611 |
VB1612 |
VW1613 |
…… |
VW1621 |
VB1623 |
VB1624 |
N個位元組 |
接受長度n |
從站地址 |
功能碼 |
資料位元組位元組數 |
資料1 數值 |
。。。。。 |
資料5 數值 |
CRC校驗低位元組 |
CRC校驗高位元組 |
讀狀態返回7個位元組,讀5個字返回15個位元組。
程式要求:定義通訊優先級別是先寫,後讀。寫命令(執行,停止,復位等)傳送級別最高,其次是寫頻率設定。寫通訊傳送後,判斷返回值,確定是否寫成功,若寫成功則不再寫,只要控制狀態或頻率改變時,再次寫。讀為一次讀變頻器狀態,一次讀當前執行引數,輪流讀取。
根據上述要求,確定了以下幾個子程式和中斷程式:
1. 初始化子程式:對自由口通訊配置波特率、偶校驗等
2. 變頻器控制子程式:輸入執行、停止、復位、地址、頻率設定等入口。輸出變頻器狀態、通訊故障碼、當前執行頻率、電流等。程式中要根據上次通訊結果判斷當前應寫還是讀。併發出XMT通訊指令,開通傳送完成中斷。
3. CRC校驗子程式:運算髮送的CRC碼。
4. 傳送完成中斷程式:根據傳送的內容,確定接受的長度,關閉接受中斷,開通接受完成中斷。
5. 接受完成中斷程式:判斷接受訊號是否正常,若不正常送出相應的故障碼。將接收到的正確訊號,送入對應暫存區內,供控制子程式輸出。關閉接受中斷。