zhuqiang1987510 2019-04-07 20:08 采纳率: 0%
浏览 2621
已结题

C#多线程访问PLC MXComponent

图片说明
开三个线程同时读取三菱PLC内变量数据。不知道问什么报错,用单线程就没有问题。第一个线程能通过,第二个就报错。

public partial class Form1 : Form
{
    public ACTETHERLib.ActQNUDECPUTCP plc1 = null;
    public ACTETHERLib.ActQNUDECPUTCP plc2 = null;
    public ACTETHERLib.ActQNUDECPUTCP plc3 = null;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.plc1 = new ACTETHERLib.ActQNUDECPUTCP();
        this.plc2 = new ACTETHERLib.ActQNUDECPUTCP();
        this.plc3 = new ACTETHERLib.ActQNUDECPUTCP();


        this.plc1.ActHostAddress ="192.168.1.21";
        this.plc1.ActHostAddress = "192.168.1.31";
        this.plc1.ActHostAddress = "192.168.1.41";

        int rtn1 = this.plc1.Open();
        int rtn2 = this.plc2.Open();
        int rtn3 = this.plc3.Open();

        if (rtn1 == 0)  MessageBox.Show("PLC1 Connect Succesful !");
        else MessageBox.Show("PLC1 Connect Fail,Please Check Comunication Setting!");
        if (rtn2 == 0) MessageBox.Show("PLC1 Connect Succesful !");
        else MessageBox.Show("PLC2 Connect Fail,Please Check Comunication Setting!");
        if (rtn3 == 0) MessageBox.Show("PLC1 Connect Succesful !");
        else MessageBox.Show("PLC2 Connect Fail,Please Check Comunication Setting!");

        Thread Read_PLC1_thread = new Thread(new ThreadStart(Read_PLC1));
        Thread Read_PLC2_thread = new Thread(new ThreadStart(Read_PLC2));
        Thread Read_PLC3_thread = new Thread(new ThreadStart(Read_PLC3));

        Read_PLC1_thread.Start();
        Read_PLC2_thread.Start();
        Read_PLC3_thread.Start();         

    }

    private void Read_PLC1()
    {
        int[] PLC1_D = new int[100];
        int rtn1 = this.plc1.ReadDeviceBlock("D1", 10, out PLC1_D[1]);
    }

    private void Read_PLC2()
      {
         int[] PLC2_D = new int[100];
         int rtn2 = this.plc2.ReadDeviceBlock("D1", 10, out PLC2_D[1]);          
      }

    private void Read_PLC3()
      {
         int[] PLC3_D = new int[100];
         int rtn3 = this.plc3.ReadDeviceBlock("D1", 10, out PLC3_D[1]);
      }


}

图片说明

}

  • 写回答

3条回答 默认 最新

  • threenewbee 2019-04-07 23:33
    关注

    可能readdeviceblock这个函数不支持重入,你需要用lock代码块同步下。

    评论

报告相同问题?

悬赏问题

  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64