西門子s7-200在與英威騰modbus通訊時,采用自己編制主站通訊程序,參照西門子uss程序格式做成庫程序,在多個項目上應(yīng)用,效果還是不錯。
西門子s7-200自由口通訊確實很自由,可以編制任何通訊。
西門子自帶的modbus主站程序,用在變頻器控制上,不方便。要求是能向uss庫程序一樣有多個控制的位信號輸入,在速度設(shè)定值變化是發(fā)送速度值,平時要讀變頻器的運(yùn)行狀態(tài)(包括故障狀態(tài)),還想讀變頻器運(yùn)行時的電流。于是,自己根據(jù)英威騰變頻器的通訊協(xié)議,編制了modbus主站通訊程序。
modbus通訊協(xié)議要求:
讀寫都是8個字節(jié),只是功能碼的不同和讀是讀得長度,寫是寫的數(shù)據(jù)值
| 發(fā)送 | vb1600 | vb1601 | vb1602 | vb1603 | vb1604 | vb1605 | vb1606 | vb1607 | vb1608 |
| 8個字節(jié) | 發(fā)送長度8 | 從站地址 | 功能碼 | 數(shù)據(jù)地址高字節(jié) | 數(shù)據(jù)地址低字節(jié) | 數(shù)據(jù)字長高字節(jié) | 數(shù)據(jù)字長低字節(jié) | crc校驗低字節(jié) | crc校驗高字節(jié) |
從上面的通訊結(jié)構(gòu)可以看出:數(shù)據(jù)地址、字長和crc都是一個字,其中地址和長度或數(shù)據(jù)高低字節(jié)與西門子定義一致,即低地址高字節(jié)。crc不一樣,是低地址低字節(jié),與計算機(jī)上的定義一致。這點必需注意。
變頻器寫返回:
| 接受 | vb1609 | vb1610 | vb1611 | vb1612 | vb1613 | vb1614 | vb1615 | vb1616 | vb1617 |
| 8個字節(jié) | 接受長度8 | 從站地址 | 功能碼 | 數(shù)據(jù)地址高字節(jié) | 數(shù)據(jù)地址低字節(jié) | 數(shù)據(jù)值高字節(jié) | 數(shù)據(jù)值低字節(jié) | crc校驗低字節(jié) | crc校驗高字節(jié) |
返回與發(fā)送時一樣,表示通訊數(shù)據(jù)接受成功,并已執(zhí)行。
我只需讀5個字的參數(shù)或1個字的狀態(tài),變頻器讀返回:
| 接受 | vb1609 | vb1610 | vb1611 | vb1612 | vw1613 | …… | vw1621 | vb1623 | vb1624 |
| n個字節(jié) | 接受長度n | 從站地址 | 功能碼 | 數(shù)據(jù)字節(jié)字節(jié)數(shù) | 數(shù)據(jù)1數(shù)值 | 。。。。。 | 數(shù)據(jù)5數(shù)值 | crc校驗低字節(jié) | crc校驗高字節(jié) |
讀狀態(tài)返回7個字節(jié),讀5個字返回15個字節(jié)。
程序要求:定義通訊優(yōu)先級別是先寫,后讀。寫命令(運(yùn)行,停止,復(fù)位等)發(fā)送級別最高,其次是寫頻率設(shè)定。寫通訊發(fā)送后,判斷返回值,確定是否寫成功,若寫成功則不再寫,只要控制狀態(tài)或頻率改變時,再次寫。讀為一次讀變頻器狀態(tài),一次讀當(dāng)前運(yùn)行參數(shù),輪流讀取。
根據(jù)上述要求,確定了以下幾個子程序和中斷程序:
1.初始化子程序:對自由口通訊配置波特率、偶校驗等
2.變頻器控制子程序:輸入運(yùn)行、停止、復(fù)位、地址、頻率設(shè)定等入口。輸出變頻器狀態(tài)、通訊故障碼、當(dāng)前運(yùn)行頻率、電流等。程序中要根據(jù)上次通訊結(jié)果判斷當(dāng)前應(yīng)寫還是讀。并發(fā)出xmt通訊指令,開通發(fā)送完成中斷。
3.crc校驗子程序:運(yùn)算發(fā)送的crc碼。
4.發(fā)送完成中斷程序:根據(jù)發(fā)送的內(nèi)容,確定接受的長度,關(guān)閉接受中斷,開通接受完成中斷。
5.接受完成中斷程序:判斷接受信號是否正常,若不正常送出相應(yīng)的故障碼。將接收到的正確信號,送入對應(yīng)暫存區(qū)內(nèi),供控制子程序輸出,關(guān)閉接受中斷。










