您好,登錄后才能下訂單哦!
Nmodubs4怎么實現單寄存器和多寄存器AO的讀寫,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
項目效果圖
一、創建plc連接
//用委托對象引用plc_connect方法。
Delegate_Connect connect1 = new Delegate_Connect(plc_connect);
a_status = 1;
connect1();
if (a_status == 0)
{
MessageBox.Show("網關連接失敗!");
return;
}
二、plc連接IP和端口,創建tcp客戶端
private void plc_connect()
{
wg_ip = INI.InitClass.ReadString("application", "WG_IP", "");
wg_port = INI.InitClass.ReadString("application", "WG_PORT", "");
try
{
tcp_wg = new TcpClient(wg_ip, Convert.ToInt32(wg_port));
my_wg = ModbusIpMaster.CreateIp(tcp_wg);
a_status = 1;
}
catch (Exception exception)
{
a_status = 0;
}
}
三、多線程處理timer
//啟動timer多線程,每隔1秒刷新在線測試數據
timer_plc_qry.Interval = 2000;
//timer_plc_qry.Enabled = true;
timer_plc_qry.Stop();
timer_plc_qry.Elapsed += TimersTimerHandler;
timer_plc_qry.Start();
//多線程timer事件 在線測試
private void TimersTimerHandler(object sender, EventArgs args)
{
if (a_status == 0) return;
if (Interlocked.Exchange(ref inTimer_plc_qry, 1) == 0 && Start)
{
//連接設備
read_plc();
read_plc_switch();
}
Interlocked.Exchange(ref inTimer_plc_qry, 0);
}
四、單寄存器和多寄存器
if (list_core[i].data_type == "word")
{
try
{
read_result = my_wg.ReadHoldingRegisters(1, Convert.ToUInt16(list_core[i].address), 1);
if (read_result != null)
{
read = read_result[0]; //讀取單個寄存器 ushort類型
this.arcScaleComponent1.Value = read;//進度條復制
Set_main_UAB(read.ToString());//label標簽復制
}
}
catch (Exception e)
{
}
}
else if (list_core[i].data_type == "float")
{
read_result = my_wg.ReadHoldingRegisters(1, Convert.ToUInt16(list_core[i].address), 2);
if (read_result != null)
{
if (Islow)
{
read_float = ModbusUtility.GetSingle(read_result[1], read_result[0]); //讀取多個寄存器,需用用函數 ModbusUtility 轉換
this.arcScaleComponent1.Value = read_float;
Set_main_UAB(read_float.ToString()); //設置主窗體控件
}else
{
read_float = ModbusUtility.GetSingle(read_result[0], read_result[1]);
this.arcScaleComponent1.Value = read_float;
Set_main_UAB(read_float.ToString());
}
}
}
五、Nmodbus4常用方法:
方法名 | 作用 | 所需參數 | 返回值 | 對應功能碼 |
ReadCoils | 讀取DO的狀態 | 從站地址(8位) byte slaveAddress 起始地址(16位)
ushort startAddress 讀取數量(16位) ushort numberOfPoints | bool[] | 01 |
ReadInputs | 讀取DI的狀態 | 從站地址(8位) byte slaveAddress 起始地址(16位)
ushort startAddress 讀取數量(16位) ushort numberOfPoints | bool[] | 02 |
ReadHoldingRegisters | 讀取AO的值 | 從站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 讀取數量(16位) ushort numberOfPoints | ushort[] | 03 |
ReadInputRegisters | 讀取AI的值 | 從站地址(8 位) byte slaveAddress 起始地址(16位)
ushort startAddress 讀取數量(16位) ushort numberOfPoints | ushort[] | 04 |
WriteSingleCoil | 寫入值到DO | 從站地址(8位) byte slaveAddress 線圈地址(16位) ushort coilAddress 寫入值(布爾型) bool value | 無返回值 | 05 |
WriteSingleRegister | 寫入值到AO | 從站地址(8位) byte slaveAddress 寄存器地址(16位) ushort registerAddress 寫入值(16位) ushort value | 無返回值 | 06 |
WriteMultipleCoils | 寫多線圈寄存器 | 從站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 寫入值(布爾型數組) bool[] data | 無返回值 | 15 |
WriteMultipleRegisters | 寫多個保持寄存器 | 從站地址(8位) byte slaveAddress
起始地址(16位) ushort startAddress, 寄存器值(16位整型數組) ushort[] data | 無返回值 | 16 |
ReadWriteMultipleRegisters | 讀寫多個保持寄存器 | 從站地址(8位) byte slaveAddress 讀起始地址(16位) ushort startReadAddress
讀取數量(16位) ushort numberOfPointsToRead, 寫入起始地址(16位) ushort startWriteAddress, 寫入值(16位整型數組) ushort[] writeData | ushort[] | 23 |
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。