Modbus聯(lián)合運(yùn)動(dòng)控制卡實(shí)時(shí)通信
前言
最近有運(yùn)動(dòng)控制的學(xué)員問(wèn)到這樣的問(wèn)題,能不能通過(guò)Modbus協(xié)議,實(shí)現(xiàn)運(yùn)動(dòng)控制卡的數(shù)據(jù)讀取。
經(jīng)過(guò)測(cè)試,切實(shí)可行。這里采用的是正運(yùn)動(dòng)的ECI1408板卡,其他品牌板卡可能不支持,具體咨詢供應(yīng)商。
MOdbus協(xié)議
正運(yùn)動(dòng)控制器支持兩個(gè)存儲(chǔ)區(qū),分別是0區(qū)和4區(qū)。
0區(qū)從地址10000開始與輸入 IN 口對(duì)應(yīng)。
0區(qū)從地址20000開始與輸出 OUT 口對(duì)應(yīng)。
4區(qū)從地址10000開始對(duì)應(yīng)軸 DPOS 區(qū)間。
4區(qū)從地址11000開始對(duì)應(yīng)軸 MPOS 區(qū)間。
4區(qū)從地址12000開始對(duì)應(yīng)軸 VP_SPEED 區(qū)間。
4區(qū)從地址13000開始對(duì)應(yīng)模擬量DA輸出區(qū)間。
4區(qū)從地址14000開始對(duì)應(yīng)模擬量AD輸入?yún)^(qū)間。
對(duì)于其他參數(shù),可以采用自定義存儲(chǔ)區(qū)0-7999來(lái)使用。


代碼測(cè)試

這里以讀取XYZ三軸的位置來(lái)進(jìn)行測(cè)試。
建立連接
????????//Modbus通信對(duì)象
????????private?ModbusTcp?modbusTcp?=?new?ModbusTcp();
????????//取消線程源
????????private?CancellationTokenSource?cts;
????????private?void?btn_Connect_Click(object?sender,?EventArgs?e)
????????{
????????????if?(modbusTcp.Connect(this.txt_IPAddress.Text,?Convert.ToInt32(this.txt_Port.Text)))
????????????{
????????????????//如果連接成功,開線程讀取
????????????????cts?=?new?CancellationTokenSource();
????????????????Task.Run(()?=>
????????????????{
????????????????????GetMotionData();
????????????????},?cts.Token);
????????????}
????????????else
????????????{
????????????????MessageBox.Show("運(yùn)動(dòng)控制卡連接失敗",?"建立連接");
????????????}
????????}
斷開連接
????????private?void?btn_DisConn_Click(object?sender,?EventArgs?e)
????????{
????????????cts?.Cancel();
????????????modbusTcp.DisConnect();
????????}
多線程讀取解析
????????private?void?GetMotionData()
????????{
????????????while?(!cts.IsCancellationRequested)
????????????{
????????????????byte[]?res?=?modbusTcp.ReadKeepReg(1,?10000,?6);
????????????????this.Invoke(new?Action(()?=>
????????????????{
????????????????????if?(res?!=?null?&&?res.Length?==?12)
????????????????????{
????????????????????????float[]?values?=?FloatLib.GetFloatArrayFromByteArray(res,?DataFormat.CDAB);
????????????????????????this.lbl_XAxis.Text?=?values[0].ToString();
????????????????????????this.lbl_YAxis.Text?=?values[1].ToString();
????????????????????????this.lbl_ZAxis.Text?=?values[2].ToString();
????????????????????}
????????????????}));
????????????}
????????}
測(cè)試結(jié)果如下:
上位機(jī)軟件實(shí)時(shí)數(shù)據(jù)顯示:

測(cè)試軟件結(jié)果顯示:

整體總結(jié)
本案例主要是測(cè)試了基于Modbus協(xié)議來(lái)讀取運(yùn)動(dòng)控制卡的相關(guān)參數(shù),這種情況主要用于第三方軟件需要運(yùn)動(dòng)控制系統(tǒng)的相關(guān)數(shù)據(jù)。同時(shí),如果后續(xù)的運(yùn)動(dòng)控制項(xiàng)目,需要提供數(shù)據(jù)給其他軟件,可以將運(yùn)動(dòng)控制卡作為一個(gè)現(xiàn)成免費(fèi)的ModbusTCP服務(wù)器,不僅可以傳遞運(yùn)動(dòng)控制參數(shù),其他參數(shù)都可以實(shí)現(xiàn)傳遞。