socket怎样同时读、写下位机,以及同时读写出现界面卡死的问题,希望高手给解决一下,小弟在此谢过大家了

ssz1990 ssz1990 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我想用socket实现同时读、写下位机plc,代码如下,timer1实现时时读下位机,timer2实现实时写下位机,我为了满足同时读写,我在写到时候让读的timer1停止一下,写完了让timer1再次启动,结果界面卡死!请问各路大神怎样实现同时读写下位机
public void Receive()
{
List<byte> sendData = new List<byte>(255);

//[1].Send
sendData.AddRange(new Byte[] { 0, 0 });//1~2.(Transaction Identifier)
sendData.AddRange(new Byte[] { 0, 0 });//3~4:Protocol Identifier,0 = MODBUS protocol
sendData.AddRange(new Byte[] { 0, 6 });//5~6:后续的Byte数量(针对读请求,后续为6个byte)
sendData.Add(0);//7:Unit Identifier:This field is used for intra-system routing purpose.
sendData.Add(3);//8.Function Code : 3 (Read Multiple Register)
sendData.AddRange(new Byte[] { 0, 10 });//9~10.起始地址
sendData.AddRange(new Byte[] { 0, 4 });//11~12.需要读取的寄存器数量

this.Write(sendData.ToArray()); //发送读请求

//[2].防止连续读写引起前台UI线程阻塞
Application.DoEvents();

//[3].读取Response Header : 完后会返回8个byte的Response Header
byte[] receiveData = this.Read(25);//缓冲区中的数据总量不超过256byte,一次读256byte,防止残余数据影响下次读取

}
public void Write(byte[] data)
{

this.socket.Send(data);

}

short m, l, k;

public byte[] Read(int length)
{

byte[] data = new byte[length];
this.socket.Receive(data);

m = data[11] ;
m <<= 8;
l = data[12];
k = (short)(m + l);
if (data[7] == 3)
{
textBox3.Text = k.ToString();
}
return data;
}
private void button1_Click(object sender, EventArgs e)
{

timer1.Start();

}
public void Send()
{
List<byte> values = new List<byte>(255);
values.AddRange(new Byte[] { 95, 0 });//1~2.(Transaction Identifier)
values.AddRange(new Byte[] { 0, 0 });//3~4:Protocol Identifier,0 = MODBUS protocol
values.AddRange(new Byte[] { 0, 11 });//5~6:后续的Byte数量 data.Length +
values.Add(2);//7:Unit Identifier:This field is used for intra-system routing purpose.
values.Add((byte)16);//8.Function Code : 16 (Write Multiple Register)
values.AddRange(new Byte[] { 0, 0 });//9~10.起始地址
values.AddRange(new Byte[] { 0, 2 });//11~12.寄存器数量
values.Add((byte)4);//13.数据的Byte数量
byte qq,ww;
ushort a1;
a1 = Convert.ToUInt16(textBox4.Text);
qq = (byte)(a1 >> 8);
ww = (byte)(a1);
//[2].增加数据
values.AddRange(new Byte[] { qq ,ww ,0,4 });//14~End:需要发送的数据
//[3].写数据
this.Write(values.ToArray());
//[4].防止连续读写引起前台UI线程阻塞
Application.DoEvents();

//[5].读取Response: 写完后会返回12个byte的结果
byte[] responseHeader = this.Read(25);

}
private void timer1_Tick(object sender, EventArgs e)
{
Receive();
}
private void timer2_Tick(object sender, EventArgs e)
{
timer1.Stop();
Send();
timer1.Start();
//Thread.Sleep(1);
}

private void button3_Click(object sender, EventArgs e)
{
timer2.Start();
}

private void button4_Click(object sender, EventArgs e)
{
Connect();
}
...全文

相关推荐

机械三维3D设计图-等离子清洗机.zip

机械三维3D设计图-等离子清洗机.zip

ZL4120505

【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)

内容概要:本文提出了一种基于神经网络的数据驱动迭代学习控制(ILC)算法,专门针对具有未知动态模型和重复任务需求的非线性单输入单输出(SISO)离散时间系统,应用于无人车路径跟踪问题,并提供了完整的Matlab代码实现。该方法充分利用神经网络强大的非线性逼近能力和数据驱动特性,结合迭代学习控制在周期性任务中逐次提升控制性能的优势,无需依赖被控对象的精确数学模型,即可实现对期望轨迹的高精度、渐进式跟踪。文中系统阐述了算法的整体架构设计、关键控制律的构建方式、权重更新机制以及在无人车系统中的具体实施流程,展示了其在复杂非线性环境下的有效性和鲁棒性。; 适合人群:具备自动控制理论、机器学习基础知识和Matlab编程能力的研究生、科研人员,以及从事自动驾驶、智能控制、机器人控制等领域的工程技术人员。; 使用场景及目标:①解决无人车、工业机器人等在执行重复性路径任务时的高精度轨迹跟踪问题;②为研究数据驱动控制、迭代学习控制与神经网络的深度融合提供一个完整的仿真案例和技术参考;③辅助研究人员复现先进控制算法,服务于学术论文的验证、课题研究或实际工程项目的技术预研。; 阅读建议:建议读者在学习过程中紧密结合所提供的Matlab代码,深入剖析算法各模块的具体实现逻辑,推荐预先掌握迭代学习控制的基本原理和神经网络的相关知识,并通过Simulink搭建仿真环境,进行不同工况下的实验验证,以深刻理解算法的控制效果、收敛特性及关键参数的调优策略。

欢多天天写代码

机械三维3D设计图-线圈自动包绝缘胶纸机.zip

机械三维3D设计图-线圈自动包绝缘胶纸机.zip

ZL4120505

MATLABSimulink模拟及会议论文,关于具备自动温度控制和能耗分析的智能太阳能热水系统。.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

海神之光

英特尔无线网卡AC8265驱动

英特尔无线网卡AC8265驱动

暴躁小萌
评论 5
收藏 已收藏
分享
返回顶部
ssz1990
C# 111,129 成员 642,538 内容