最近,自己写modbustcp,自己拼接字节串,那个麻烦啊,让人崩溃,干脆在软件上搜索,看看动态库Nmodbus4是否好用,那就来一段吧,写一个小的demo,闲话少说,直接上程序
static void Main(string[] args)
{
string ipaddress = "192.168.1.10";
int port = 502;
IPEndPoint IPE = new IPEndPoint(IPAddress.Parse(ipaddress),port);
TcpClient client = new TcpClient();
client.Connect(IPE);
//创建ip;
try {
//对plc进行有效连接
ModbusIpMaster master = ModbusIpMaster.CreateIp(client);
master.Transport.ReadTimeout = 1500;
Console.WriteLine("成功连接到plc");
//1.读取装置的线圈状态 Q点
//bool[] Coils = new bool[20];
//Thread t1 = new Thread((s)=> {
// while (true)
// {
// StringBuilder sb = new StringBuilder();
// Coils = master.ReadCoils(0, 10);
// for (int i = 0; i < 10; i++)
// {
// sb.Append(Coils[i]+" ");
// }
// Console.WriteLine("output:" + sb.ToString()+"\r\n");
// Thread.Sleep(1000);
// }
//});
//t1.IsBackground = true;
//t1.Start();
2.读取装置输入点的状态 输入点1点;
//bool[] inputCoils = new bool[20];
//Thread t2 = new Thread((s) => {
// while (true)
// {
// StringBuilder sb = new StringBuilder();
// inputCoils = master.ReadInputs(0,10);
// for (int i = 0; i < 10; i++)
// {
// sb.Append(inputCoils[i] + " ");
// }
// Console.WriteLine("input:"+sb.ToString() + "\r\n");
// Thread.Sleep(1000);
// }
//});
//t2.IsBackground = true;
//t2.Start();
3.读取模拟量AI的值
//ushort[] inputRegisters = new ushort[10];
//Thread t3 = new Thread((s) => {
// while (true)
// {
// StringBuilder sb = new StringBuilder();
// inputRegisters = master.ReadInputRegisters(0,10);
// for (int i = 0; i < 10; i++)
// {
// sb.Append(inputRegisters[i] + " ");
// }
// Console.WriteLine("inputRegisters:" + sb.ToString() + "\r\n");
// Thread.Sleep(1000);
// }
//});
//t3.IsBackground = true;
//t3.Start();
//读取多个保持型寄存器
//Thread t6 = new Thread((s) => {
// ushort[] registers = new ushort[50];
// while (true)
// {
// StringBuilder sb = new StringBuilder();
// registers = master.ReadHoldingRegisters(0,5);
// for (int i = 0; i < 5; i++)
// {
// sb.Append(registers[i]+" ");
// }
// Console.WriteLine(sb.ToString()+"\r\n");
// Thread.Sleep(1000);
// }
//});
//t6.IsBackground = true;
//t6.Start();
4.对Q点进行写入 写单个寄存器
//int p = 0;
//bool flag = false;
//Thread t4 = new Thread((s) => {
// while (true)
// {
// p++;
// if (p % 2 == 1)
// {
// flag = true;
// }
// else flag = false;
// master.WriteSingleCoil(5,flag);
// Console.WriteLine("写入的第5位为:" + flag + "\r\n");
// Thread.Sleep(1000);
// }
//});
//t4.IsBackground = true;
//t4.Start();
5.保持型寄存器 写单个寄存器
//ushort q = 0;
//Thread t5 = new Thread((s) => {
// while (true)
// {
// q++;
// master.WriteSingleRegister(2,q);
// Console.WriteLine("保持寄存器写入的第2个为:" +q + "\r\n");
// Thread.Sleep(1000);
// }
//});
//t5.IsBackground = true;
//t5.Start();
//7.保持寄存器多个写入
Thread t7 = new Thread((s) => {
ushort k1 = 0, k2 = 1;
ushort[] registers = new ushort[2] {k1,k2 };
while (true)
{
registers[0]++;
registers[1]++;
master.WriteMultipleRegisters(0,registers);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 2; i++)
{
sb.Append(registers[i] + " ");
}
Console.WriteLine("多寄存器写入数据位:"+sb.ToString() + "\r\n");
Thread.Sleep(1000);
}
});
t7.IsBackground = true;
t7.Start();
}
catch
{
Console.WriteLine("plc连接失败");
}
Console.ReadKey();
}