#实习不久上手一个基于modbus通讯协议的上位机软件
期间网上查了大量的相关知识,感觉动起手来还是有点困难,无意boss的一句话让我改变了方向。我去接触了modbus类库无意中发现了开源的nmodbus类库,在网上查到了相关的使用手册——nmodbus API 使用手册。
这下简直是轻松了好多,直接引用进来,然后调用相关功能即可。
关于nmodbus包的下载,其实vs很强大。
以用vs2013为例;
1.在项目工程里面--管理NuGet程序包--搜索你需要的包(nmodbus4)--安装即可。
2.然后只需要引用using modbus.device;具体会根据你的需求添加你需要的命名空间就ok。
3.根据你的需求去实现功能就可以了。
#有了nmodbus以后 你直接可以读取寄存器里面的数据,完全不需要crc校验去验证数据的准确性。
定义初始化如下:
public SerialPort serialPort1 = new SerialPort("COM1");//声明串口
public IModbusSerialMaster master= ModbusSerialMaster.CreateRtu(serialPort1);//连接方式是如RTU
//串口的初始化如下
serialPort1.BaudRate = 115200;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.Open();
基本功能如下;
读取数据函数:
byte slaveId = 1;
ushort startAddress = 0;
ushort numRegisters = 10;
ushort[] registers = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
ushort startAddress = 0;
ushort numRegisters = 10;
ushort[] registers = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
//读取寄存器数据到register数组中
//需要处理数据的话 后面可能就需要数据的转化
写数据函数:
byte slaveID = 1;
ushort registerAddress = 0;
ushort value = 100;//你要写的值
master.WriteSingleRegister(slaveID, registerAddress, value);
ushort registerAddress = 0;
ushort value = 100;//你要写的值
master.WriteSingleRegister(slaveID, registerAddress, value);
#后面涉及到数据的连续读取,建议使用定时响应事件,最好每次读完寄存器数据后执行清零操作。
定时事件函数:
System.Timers.Timer t = new System.Timers.Timer(1000);//定时1000毫秒
t.Elapsed += new System.Timers.ElapsedEventHandler(serialPort1_DataReceived);绑定事件
t.AutoReset = true;//执行一次false
t.Enabled = true;
t.AutoReset = true;//执行一次false
t.Enabled = true;
###大四实习生,希望能帮到和我一样刚开始无从下手的你###