关于C# 通过MPI通讯协议,连接西门子plc300,经常卡死崩溃问题!!

tj_libo 2019-06-12 06:53:52
现有一wpf程序,通过MPI通讯协议 连接西门子PLC300
连接成功后 开启2个线程监听两个M地址的值是否为true,如果为true则向本地数据库插入数据,
监听时间M1地址2秒,M2地址5秒
连接PLC成功后
isThreadRunFZ = true;
threadFZ = new Thread(ThreadReadServerFZ);
threadFZ.IsBackground = true;
threadFZ.Start();

isThreadRunZL = true;
threadZL = new Thread(ThreadReadServerZL);
threadZL.IsBackground = true;
threadZL.Start();

======================================================
private void ThreadReadServerZL()
{
while (isThreadRunZL)
{
Thread.Sleep(timeSleepZL);//2秒
try
{
bool saveType = false;
DCProdave.GetMBitData(150, 0, ref saveType);
if (saveType)//如果M地址值为true
{
Dispatcher.Invoke(new Action<short>(AddDataCurve), (short)1);//执行数据库插入方法
}
}
catch (Exception ex)
{
return;
//MessageBox.Show("读取失败1:" + ex.Message);
}
}
}

private void ThreadReadServerFZ()
{
while (isThreadRunFZ)
{
Thread.Sleep(timeSleepFZ);//5秒
try
{
bool saveTypeFZ = false;
DCProdave.GetMBitData(42, 0, ref saveTypeFZ);
if (saveTypeFZ)
{
if (PitNoFZ == "")
{
。。。访问webservice得到返回值。。
}
Dispatcher.Invoke(new Action<string>(AddDataCurveFZ), PitNoFZ);//插入数据库
}
else
{
。。。。。
}
}
catch (Exception ex)
{
//return;
//MessageBox.Show("读取失败2:" + ex.Message);
}
}
}

========================================================================

一直监听,只要点了wincc上某个按钮,改变M地址值,我就向数据库插入数据。
可是运行一会就程序崩溃。。根本就不catch任何错误,直接“xxx应用程序已停止工作” 欲哭无泪啊。。。。
...全文
608 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tj_libo 2019-06-13
  • 打赏
  • 举报
回复
at Model_DAL_SQLHelper.DCProdave.mb_bittest(Int32, Int32, Byte ByRef)//读取M地址 at Model_DAL_SQLHelper.DCProdave.GetMBitData(Int32, Int32, Boolean ByRef)//读取M地址 at WpfApp1.MainWindow.ThreadReadServerZL() //线程
tj_libo 2019-06-13
  • 打赏
  • 举报
回复
日志分析是读取M地址报错,难道是读取频率太快,而MPI只支持低频率? Application: WpfApp1.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.AccessViolationException Stack: at Model_DAL_SQLHelper.DCProdave.mb_bittest(Int32, Int32, Byte ByRef) at Model_DAL_SQLHelper.DCProdave.GetMBitData(Int32, Int32, Boolean ByRef) at WpfApp1.MainWindow.ThreadReadServerZL() at System.Threading.ThreadHelper.ThreadStart_Context(System.Object) at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) at System.Threading.ThreadHelper.ThreadStart()
zijiang001 2019-06-12
  • 打赏
  • 举报
回复
看下windows日志分析一下
一.从w95_s7.dll中导入PLC通讯函数的方法[DllImport] 在使用DllImport之前,必须引入InteropServices, 代码如下: using System.Runtime.InteropServices; 具体使用方法可以参考我的博客中转载的一篇文章 《C#(.net)中的DllImport用法[转] 》写的很不错,千万要注意C++数据类型到C#的对应关系,选用合适的类型。比如 char* 可以用string来转换,指针类型可以ref 或者数组。 原文地址:http://www.cnblogs.com/xumingming/archive/2008/10/10/1308248.html 二.定义结构体类型 2.1 PLC连接参数结构体 1//定义结构体[连接PLC所需参数] 2public struct PLCConnParam 3{ 4 public byte Addres; // 定义CPU的MPI/DP地址 5 //public byte SegmentId; // 保留为0 6 public byte Rack; // 定义CPU的机架号 7 public byte Slot; // 定义CPU的槽号 8} 2.2 PLC存储区域类别编号 1//定义枚举类型[PLC的存储区域编号] 2public enum PLCBlockType 3{ 4 I = 1, //Input bytes 5 Q = 2, //Output bytes 6 M = 3, //Flag bytes 7 T = 4, //Timer words 8 Z = 5, //Counter words 9 D = 6, //Data from DB 10} 三.常用函数详细讲解 3.1 建立PLC连接函数 首先从W95_S7.DLL中导入连接函数,访问权限为私有,C#将会对此函数进行封装,供外部调用,稍后讲解. 1/**//// PLC建立连接,该函数必须在其他所有函数调用之前被调用 2/// 3/// 连接数,在DOS,WIN3.1最多可以有4个,在WIN95以上最多可以有16个 4/// PLC通讯的设备名称,一般为S7ONLINE 5/// 参数列表,4个值分别为MPI/DP地址,保留值=0,槽号,机架号 6/// 0正常返回,非0为错误号 7[DllImport("w95_s7.dll")] 8private extern static int load_tool(byte nr, string device, byte[,] adr_table); 说明: 在一个MPI/DP网络中若有多个PLC时,可指定多个连接列。最后一列的所有参数须置0,以标志参数列结束。例如一个MPI/DP网中有两个PLC,他们的MPI地址分别为2和3,槽号均为2,机架号均为0,则可按如下方式调用:byte[,] ba={{2,0,2,0},{3,0,2,0},{0,0,0,0}}; int err=load_tool(1, "s7online",ba); 返回值为int型,如果返回0则表示执行成功,非零值,则需要根据错误号查找到错误具体信息,具体参照本文第五部分:错误代码字典

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧