上篇文章我们一起学习实践了,如何通过s7.NET的驱动,来实现C#与S7-200smart之间的通讯。
C#连接S7-200 smart通讯测试
以前也通过C#作了关于S7_1500之间的通讯测试
利用C#读取S7-1500的测试
同时也做了一个简单的年月日报表
C#实现自动化报表--终版(含C#原代码)
这些都用到了一个线程。其实我对线程也不是很了解,但是测试过程中发现使用了线程后,很多事情可以同时做。
比如我们本次连续读4个数据。
在没有使用线程的时候,我们无法操作【退出】及其他按钮。
那我们怎么引入线程呢;
这里我们需要在首次加载一个允许跨线程
CheckForIllegalCrossThreadCalls = false;
其次定义一个线程:
Tread XC;
接着我们在定时器里面编写一个线程程序:
private void timer1_autoread_Tick(object sender, EventArgs e)
{
xc = new Thread(dataR);
xc.Start();//启动线程
void dataR()//建立线程执行程序
{
if (plc.IsConnected == false)
{
MessageBox.Show("未连接PLC!", "连接提示", MessageBoxButtons.OK);//检查PLC是否连接;
}
else
{
try
{
string[] arr = (txtAddress2.Text.ToUpper()).Split('.');
string valuetype = arr[1].Substring(0, 3);
if (valuetype == "DBX")
{
bool test1 = (bool)plc.Read(txtAddress2.Text.ToUpper());
txtReadData.Text = txtAddress2.Text + ":" + test1.ToString();
}
else if (valuetype == "DBW")
{short test3 = ((ushort)plc.Read(txtAddress2.Text.ToUpper())).ConvertToShort();
txtReadData.Text = txtAddress2.Text + ":" + test3.ToString();
}
else if (valuetype == "DBD")
{
double test5 = ((uint)plc.Read(txtAddress2.Text.ToUpper())).ConvertToFloat();
txtReadData.Text = test5.ToString("F3");
string a1 = "DB1.DBD28";
string a2 = "db1.dbd32";
string a3 = "db1.dbd36";
double test6 = ((uint)plc.Read(a1.ToUpper())).ConvertToFloat();
PT1.Text = test6.ToString("F3") + "Mpa";//1号压力
double test7 = ((uint)plc.Read(a2.ToUpper())).ConvertToFloat();
PT2.Text = test7.ToString("F3") + "Mpa";//2号压力
double test8 = ((uint)plc.Read(a3.ToUpper())).ConvertToFloat();
PT3.Text = test8.ToString("F3") + "Mpa";//2号压力
}
else
{
MessageBox.Show("请检查地址是否输入错误!", "输入提示", MessageBoxButtons.OK);
}
}
catch (Exception Ex)
{
MessageBox.Show("请检查地址是否输入错误!" + Ex, "输入提示", MessageBoxButtons.OK);
}
}
}
}
测试效果:
|