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时,最后提示失败的话。
尝试使用管理员身份打开就可以解决了。
在线程中想要对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时,最后提示失败的话。
尝试使用管理员身份打开就可以解决了。
相关文章推荐
- 与三菱Q系列PLC-TCP通信(MC协议)学习总结
- 笔试、面试中遇到的进程通信的问题
- 循环调用FTP通信时遇到的问题
- JAVA视频系列,学习JAVA常遇到的问题,连载【方法篇】。
- 2011-11-11(2440linux实验一)编译linux内核遇到的问题及解决办法
- Selenium私房菜系列9 -- 我遇到的问题及解决问题的方法
- nagios+pnp4nagios系列文章(一) 安装配置及rrdtool出图最详细配置,解决途中遇到的各种问题!!!
- 串口通信应用程序移植时遇到问题解决方法
- hp 430 系列安装xp系统问题&.net framework 3.5 安装期间遇到问题,安装不上。
- 东北大学操作系统实验:进程同步和通信(生产者消费者问题模拟)
- Eclipse Rcp系列 5 开发过程中遇到的小问题合集
- 数据库实验中遇到的问题以及解决方法
- MVC系列学习(零)-本次学习可能会遇到的问题汇总
- 【微机实验系列】基于微机的串行通信口扩展
- Selenium私房菜系列10 -- 我遇到的问题及解决问题的方法
- 三菱Q系列PLC的modbusTCP通讯
- vue -(问题系列)节点Sass无法为您的当前环境找到绑定:OS X 64位和Node.js 8.x(遇到)
- Eclipse Rcp系列 5 开发过程中遇到的小问题合集
- 在Ubuntu下实现本地套接字(socket)通信以及遇到的问题!
- 在C#中使用SerialPort类实现串口通信 遇到多线程问题