您的位置:首页 > 编程语言 > C#

C#PC与三菱Q系列PLC通信小实验中遇到的问题

2017-10-30 15:55 686 查看
1.在线程中处理控件时报错。

在线程中想要对TextBox写入时,报错。

解决:

                    this.Invoke(new MethodInvoker(delegate()

                    {

                        this.ShowRead.Text = DisplayData; //对控件的操作

                    }));

2.想要程序一直读取PLC寄存器的值并显示出来,于是使用了一个while循环,但这时结果显示有误。

解决:

将这个while循环写入线程中。

注意使用线程的话,需要引用库,添加一个using System.Threading;

                new Thread(delegate()

                    {

                        while (lampState)

                        {             

                            ReturnCode = act.ReadDeviceRandom2(lpszDeviceName, iNumberOfDeviceName, out lpshDeviceValue);

                            if (ReturnCode == 0)

                            {

                                this.Invoke(new MethodInvoker(delegate()

                                    {

                                        if (lpshDeviceValue == 1)

                                        {

                                            this.Lamp.BackColor = Color.Gold;

                                        }

                                        else if (lpshDeviceValue == 0)

                                        {

                                            this.Lamp.BackColor = Color.White;

                                        }

                                        else

                                        {

                                            this.Lamp.BackColor = Color.Red;

                                        }

                                        this.Lamp.Text = lpshDeviceValue.ToString();

                                    }));

                            }

                        }

                    }).Start();

3.Win10系统,Debug的时候出现错误号:80040154,显示注册类问题。

解决:

将运行平台变为X86,Configuration Manager-Active solution platform(X86)

4.使用ReadDeviceRandom2(lpszDeviceName, iNumberOfDeviceName, out lpshDeviceValue)函数时,当需要读取几个连续的Device时,需要将这几个设备名称用回车间隔开来。

                            lpszDeviceName = "SD210" + "\n" + "SD211" + "\n" + "SD212" + "\n" + "SD213";

                            rReturnCode = act.ReadDeviceRandom2(lpszDeviceName, iNumberOfDeviceName, out lpshDeviceValue[0]);

这样就会返回一串值的地址。

5.字符串的截取

                            TiHex1 = WeekHex.Substring(0, 2) + DateHex.Substring(0, 2);

0是截取的起始位置(也就是最高位),2是需要截取的字符个数。

6.十进制转换成十六进制及字符串

                        this.ShowRead.Text = lpshDeviceValue.ToString();//转换字符串

                        DisplayData = lpshDeviceValue.ToString("X");//转换十六进制

7.将ASCII码转换成十进制数

                    //byte[] array = System.Text.Encoding.ASCII.GetBytes (lpshDeviceValue.ToString());

                    //string ASCIIstr2 = null;

                    //for (int i = 0; i < array.Length; i++)

                    //{

                    //    int asciicode = (int)(array[i]);

                    //    ASCIIstr2 += Convert.ToString(asciicode);//字符串连接用+

                    //}

将十进制转换成ASCII码

                    DisplayData = lpshDeviceValue.ToString("X");

                    byte  [] array = new byte[(DisplayData.Length+1)/2];

                    int index = ((DisplayData.Length + 1) / 2)-1;

                    for (int i = 0; i < DisplayData.Length; i += 2)

                    {

                        array[index] = Convert.ToByte(DisplayData.Substring(i, 2),16);

                        index--;

                    }//注意这里,由于PLC中存储时低八位与高八位呼唤,所以这里将DisplayData最高位赋值给array最低位

8.什么时候需要用到强制转换

int是32位,short是16位

将short转换成int是可以自动转换

将int换成short需要强制转换

9.一个以BCD码形式在PLC保存的值,若它以十进制形式作为返回值,则这个返回值的十六进制是这个BCD码

例如:一个BCD码是0001 0111 0001 0000,即1710

          将这个二进制BCD码转换成十进制就是5904,而5904的十六进制正好是1710

10.三菱Q系列PLC,存储CPU时间的寄存器

SD210,年的低两位,月;SD211,日期,小时;SD212,分钟,秒钟;SD213,年的高两位,星期

11.基于VS读取三菱Q系列PLC的步骤

Step1:添加引用,ActUtlTypeLib

Step2:定义一个这样的类,ActUtlType act = new ActUtlType();//act是这类的名称

Step3:打开,让PC开始读取PLC程序,iReturnCode =act.Open();

          若返回0,则打开成功

Step4:读取,iReturnCode = act.ReadDeviceRandom2( lpszDeviceName,iNumberOfDeviceName,out lpshDeviceValue);

          写入,wReturnCode = act.WriteDeviceRandom2(lpszDeviceName, iNumberOfDeviceName, ref lpshDeviceValue);

Step5:停止读取,ReturnCode = act.Close();

12.使用Communication Setting Utility创建一个新的Logical Station number时,最后提示失败的话。

尝试使用管理员身份打开就可以解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PLC 通信 线程 ASCII