在與英威騰(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. 接受完成中斷程序:判斷接受信號是否正常,若不正常送出相應的故障碼。將接收到的正確信號,送入對應暫存區內,供控制子程序輸出。關閉接受中斷。