使用C#,nmodbus4,实现了读取单个从站的数据,使用2个timer读取2个从站时,程序卡死。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用C#,nmodbus4,实现了读取单个从站的数据,使用2个timer读取2个从站时,程序卡死。相关的知识,希望对你有一定的参考价值。

如何使用nmodbus4轮询读取多个从站数据?
public partial class Form1 : Form

public Form1()

InitializeComponent();

SerialPort port = new SerialPort("COM5");
byte slaveId = 6;
ushort startAddress = 0;
ushort numRegisters = 6;

byte slaveId1 = 3;
ushort startAddress1 = 0;
ushort numRegisters1 = 1;

bool done1 = true;
bool done2 = true;

private void Form1_Load_1(object sender, EventArgs e)

// configure serial port
port.BaudRate = 9600;
port.DataBits = 8;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.Open();

private void timer1_Tick(object sender, EventArgs e)

// create modbus master
IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
bool[] a = master.ReadInputs(slaveId, startAddress, numRegisters);
if (a[0] == false)

textBox2.BackColor = Color.Red;

else textBox2.BackColor = Color.Black;

for (int i = 0; i < numRegisters; i++)

textBox1.Text = textBox1.Text + " " + a[i].ToString();



private void timer2_Tick(object sender, EventArgs e)

IModbusSerialMaster master1 = ModbusSerialMaster.CreateRtu(port);
ushort[] registers = master1.ReadInputRegisters(slaveId1, startAddress1, numRegisters1);//04指令
if ( registers[0] == 1)

textBox4.BackColor = Color.Red;

else textBox4.BackColor = Color.Black;
for (int i = 0; i < numRegisters1; i++)

textBox3.Text = registers[i].ToString("X04");

MPI:是西门子专为300 400系列PLC设计的通信协议,协议不开放。PLC和编程软件使用该种协议通信。此种协议可以支持多主站,但是通讯距离和波特率都比较小。 DP就是PROFIBUS-DP协议。是一种总线协议,也是目前市场上用得比较多的一种协议。通讯波特率最大支持12MB,距离1200M,可以用来实现和上位机,从站,以及分布式I/O等实现高速远距离的通讯。 PROFIBUS DP:是作为德国国家标准DIN 19245和欧洲标准prEN 50170的现场总线。ISO/OSI模型也是它的参考模型。由Profibus -Dp、Profibus -FMS、Profibus-PA组成了Profibus系列。Profibus的传输速率为9.6K~12Mbps,最大传输距离在9.6K~187.5Kbps时为1000m,500Kbps时为400m,1500Kbps时为200m,3000K~12000Kbps时为100m,可用中继器延长至10km。其传输介质可以是双绞线,也可以是光缆,最多可挂接127个站点。Profibus支持主-从系统、纯主站系统、多主多从混合系统等几种传输方式。主站具有对总线的控制权,可主动发送信息。对多主站系统来说,主站之间采用令牌方式传递信息,得到令牌的站点可在一个事先规定的时间内拥有总线控制权,共事先规定好令牌在各主站中循环一周的最长时间。按Profibus的通信规范,令牌在主站之间按地址编号顺序,沿上行方向进行传递。主站在得到控制权时,可以按主-从方式,向从站发送或索取信息,实现点对点通信。主站可采取对所有站点广播 (不要求应答),或有选择地向一组站点广播。用于现场层的高速数据传送。主站周期地读取从站的输入信息并周期地向从站发送输出信息。总线循环时间必须要比主站(PLC)程序循环时间短。除周期性用户数据传输外,PROFIBUS-DP还提供智能化设备所需的非周期性通信以进行组态.诊断和报警处理。①传输技术:RS-485双绞线.双线电缆或光缆。波特率从9.6K bit/s到12M bit/s。②总线存取:各主站间令牌传递,主站与从站间为主-从传送。支持单主或多主系统。总线上最多站点(主-从设备)数为126。Profibus的理论地址范围:0~127(127为广播地址)。最多可用32个主站,总的站数可达127个 参考技术A 开线程一直循环让代码自己运行拿他的返回值就行了,我也是新手不知道计时器的事件是不是占主线程,我做西门子PROFINT通信用的Sharp7就是这么做的,你可以试一试 参考技术B 不可以放在两个timer里,可能会同时向modbus总线上发指令,这样就会产生错误 参考技术C 我的也是,请问您怎么解决的呀/

以上是关于使用C#,nmodbus4,实现了读取单个从站的数据,使用2个timer读取2个从站时,程序卡死。的主要内容,如果未能解决你的问题,请参考以下文章

基于XMC4800 Ethercat从站的工厂自动化解决方案

基于XMC4800 Ethercat从站的工厂自动化解决方案

组态DP主站与标准从站的步骤

PLCsim 软件模拟OB86故障

上位机基础-PLC通信篇

CANopen 基础