伺服驅動器是構成伺服系統的基本部件,廣泛應用于各種電力傳動自動控制系統中,如:數控機床、柔性制造系統、機器人驅動、火炮隨動系統、雷達控制、艦船推進、車輛驅動、印刷設備、紡織設備、縫紉設備等。在應用伺服驅動器的過程中,實時讀取和修改各個控制參數來達到實時控制,是對伺服系統的基本要求。 本文即針對德國博世力士樂的伺服驅動器indradrive,采用靈活易用的vb6.0編程語言,通過indradrive本身所帶的rs232串行通信接口,實現了上位pc機與伺服驅動器的串行通信,完成了對伺服驅動器內部各控制參數的實時控制。 indradrive的通信協議 indradrive采用sis通信協議,它是一種二進制通信協議,含有完整的報文格式和返回校驗格式。針對博世力士樂的各種產品(PLCAndPAC.html" target="_blank">plc、伺服驅動器等),sis協議的通信格式是統一的。 sis協議采用的數據格式為:1位起始位,8位數據,1位或2位停止位,無校驗位;通信傳輸數據的波特率為115200bps。sis協議采用十六進制數據格式來表示各種指令代碼及數據,其軟件通信指令經過優化設計后,只有兩條,一條為讀指令,一條為寫指令,兩條指令使得上位機軟件編寫非常方便。 sis協議的報文格式如附表所示。 附表 sis協議的報文格式 第一個字節stz:起始位,默認為0x02; 第二個字節cs:用于校驗數據,它的值是除此字節外,所有的數相加后的低8位值異或ff,再加1后的值; 第三個字節datl:除去報頭后所有數據的長度(字節的個數); 第四個字節datlw:重復第三個字節的內容; 第五個字節cntrl:決定錯誤返回類型,默認為0x00; 第六個字節service:服務類型(讀參數寫0x80,寫參數寫0x8f); 第七個字節adrs:驅動器地址; 第八個字節adre:驅動器地址。 用戶數據頭包含5個字節,意義如下: 第一個字節control byte:操作參數值,默認為0x3c; 第二個字節device address(unit address):驅動器地址; 第三個字節parameter type:參數類型,對于驅動器其值為0x00; 第四、五字節parameter number:參數號,對于驅動器的s參數,直接寫參數號的十六進制值;對于p參數,寫“215+參數號”的十六進制值。 用戶數據的數據長度取決于操作參數的數據類型,如操作參數為int型,寫2個字節;為dword型,寫4個字節。寫的時候注意低位字節在前,高位字節在后。 vb實現pc機與indradrive的串行通信 pc機與indradrive的通信常采用主從問答方式,pc機始終具有初始傳送優先權,所有的通信均由pc機來啟動。每次通信都是由pc機通過發送(讀/寫參數)命令啟動通信,indradrive在接到pc機發送的命令后,首先檢查命令中的起始標志,然后檢查命令中的驅動器地址是否與自己的驅動器地址相符,如果不一致,說明計算機是與其它的驅動器進行通信,從而忽略該命令;如果一致,就響應該命令,并將執行結果回送到pc機,一次通信過程結束。 在vb的控件工具箱中提供了一個使用非常方便的串行通信控件mscomm,它全面地提供了使用串行通信上層開發的所有細則,串行通信的實現既可以采用中斷方式,又可以采用查詢方式。mscomm控件提供了實現串行端口中斷功能的oncomm事件,該事件是唯一的,可以截取串口的任何消息,當有串口事件或錯誤發生時,vb程序就會自動轉入oncomm事件處理程序中。commevent屬性存有串口最近的事件或錯誤的數值代碼,可以在程序中隨時讀取commevent屬性值來了解通信情況,oncomm事件是和commevent屬性密切相關、一起使用,當任何一個oncomm事件或錯誤發生時,都會使得commevent屬性值改變。在oncomm事件處理過程中,可以通過判斷commevent屬性值,對于不同的屬性值轉入不同的事件處理過程。 根據sis通信協議的規定,vb程序中主要是針對mscomm控件的操作,主要有mscomm控件的初始化和oncomm事件的處理。 mscomm控件的主要初始化代碼如下: mscomm_com1.commport = 1 ‘設定需要使用的串口 mscomm_com1.settings = “115200,n,8,1” ‘設定傳輸的波特率和校驗方式 mscomm_com1.portopen = true ‘打開通信串口 mscomm_com1.rthreshold = 1 ‘設置輸入緩沖區字符輸入門限 oncomm事件的處理程序主要代碼如下: private sub mscomm_com1_oncomm() dim input_buffer as variant dim upper_limit as integer dim input_to_hex as string dim i as integer input_buffer = mscomm_com1.input ‘從接收緩沖區copy字符 upper_limit = ubound(input_buffer) ‘收到數據的個數 for i = 0 to upper_limit input_to_hex = hex(input_buffer(i)) ‘將接收到的數據轉化為十六進制 if len(input_to_hex) 《 2 then ‘將不滿兩位的十六進制值前補0 input_to_hex = “0” & input_to_hex end if if i = 0 then ‘每開始新的一次接收,清空顯示文本框 txtreceivedata.text = “” end if txtreceivedata.text = txtreceivedata.text & input_to_hex & “ ” ‘顯示接收的內容 next end sub 讀寫命令實例及注意事項 有了上面的基礎,就可以根據sis協議的數據格式來實時讀寫indradrive的內部參數,如讀取位置反饋值參數s-0-0051的值,首先將參數號51轉化為十六進制數33,即在用戶數據頭的第四、五兩個字節分別寫入3300(注意:高字節在后,低字節在前);其它字節可以相繼得出,因是讀參數值,所以不需寫用戶數據;從而發送內容應為:02 02 05 05 00 80 01 01 3c 01 00 33 00。如果通信正常,則會接收到類似的字節內容:02 20 07 07 10 80 01 01 00 3c 01 4e ac 07 00,其中后4個字節即為位置反饋值(注意:高字節在后,低字節在前),十六進制表示應為7ac4e,將其轉化為十進制為502862,實際的位置值應為50.2862(位置值的分辨率為0.0001)。在寫參數時,和讀參數的不同的地方就是用到用戶數據,也就是將欲寫入的值寫到用戶數據的位置。如將100.0000寫入最大行程值參數s-0-0278,首先將參數號278轉化為十六進制數116,即在用戶數據頭的第四、五兩個字節分別寫入16 11;再將1000000(注意不是100.0000)轉化為十六進制為f4240,即在用戶數據的四個字節依次寫入40 42 0f 00;其它字節可以相繼得出;發送內容應為:02 76 09 09 00 8f 01 01 3c 01 00 16 01 40 42 0f 00。如通信正常,則會接收到:02 1a 03 03 10 8f 01 01 00 3c 01,表示改寫參數成功。 值得注意的是,除了在數據格式上遵從sis協議之外,操作過程中還應注意以下幾點: 通信波特率應為115200 bps。 寫參數時,應先使indradrive處于pm(參數模式)。通過置位參數s-0-0420(激活參數模式)的bit1、bit0,就可以將indradrive切換到pm;而在改寫參數s-0-0420時,不需在pm;在將s-0-0420的bit1和bit0置位后,不要忘了再將其復位,這樣便進入pm,便可以隨意改寫參數了。在配置完參數后,應該跳出pm,進入om(操作模式),通過參數s-0-0422(跳出參數模式)來完成,配置過程與s-0-0420類似。 (3)讀參數時無論indradrive處于pm和om均可讀取,沒有限制。 (4)讀參數時,接收到內容的第11個字節以后的內容為用戶數據;而寫參數時,接收到的內容中沒有用戶數據部分,只要通信正常,均會收到相同內容02 1a 03 03 10 8f 01 01 00 3c 01。 (5)如果正在上位機用indraworks調試indradrive,則讀寫參數時,應使indraworks離線,否則會提示串口被占用。 結語 本文所闡述的串口通信方法已成功應用于調試博世力士樂indradrive伺服驅動器的實驗中,靈活方便,達到了實時修改驅動器的參數的要求;適當改進即可應用于地鐵站臺屏蔽門系統和安全門系統以及自動門系統的上位機監控,具有較好的實際價值和可擴展性。 |