C#实现上位机与欧姆龙PLC的通信Word下载.docx
- 文档编号:16160506
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:13
- 大小:404.90KB
C#实现上位机与欧姆龙PLC的通信Word下载.docx
《C#实现上位机与欧姆龙PLC的通信Word下载.docx》由会员分享,可在线阅读,更多相关《C#实现上位机与欧姆龙PLC的通信Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
在写上位机之前你也可以现写一个FCS校验器,反正后续的代码总是要写的。
*CR是结束符,*比较容易打出来,CR就是回车键,程序中表现时可以用”\r”来表示。
再比如说@00RD0100000156*CR是向DM0100开始的数据区,连续读0001个数据,在这里也就是连续读一个数据。
当然你给PLC发一个数据,如果格式正确,PLC也会响应你一个数据,见下表。
在这里讲一下返回的状态码,根据状态码,我们可以知道发送的数据有没有出现错误。
正常情况下,返回的只能是00,如果不是00,请根据上表,自己修改错误。
下面我先把我写的FCS校验码贴出来吧,
代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingSystem.Windows.Forms;
namespace异或测试
{
publicpartialclassForm1:
Form
{
publicForm1()
InitializeComponent();
}
privatevoidbutton1_Click(objectsender,EventArgse)
stringstr=textBox1.Text;
Int16[]a=newInt16[str.Length];
//将字符串中的一个个字符,分离出来,并保存
for(inti=0;
i<
str.Length;
i++)
a[i]=Convert.ToInt16(str[i]);
Int16FCS=0;
FCS=(Int16)(FCS^a[i]);
//异或计算FCS码
stringstr_FCS;
//把计算出来的FCS码再转成字符串
str_FCS=FCS.ToString("
x2"
);
textBox2.Text=str_FCS;
}
写的不太好,就当自己测试的时候用了。
特别要注意的是,PLC在运行状态是不能向DM区写数据的。
必要的时候我们可以通过向PLC发送不同指令来改变其工作模式。
指令如下:
模式的改变
PROGRAM@00SC0050*
MONITOR@00SC0252*
RUN@00SC0353*
"
00"
是站號
最基本的东西已经说得比较清楚了,下面把代码也贴出来吧,同样代码也写的比较乱,让内行人见笑了。
大体上看一共就用了这几个事件。
下面是其具体的代码:
本人做的是一个恒压供水的项目,这里只是一个产品的测试,故有很多地方还不严谨,思路不是很清楚,我感觉这也我一周弄出来的,还是比较不错的
usingSystem.IO.Ports;
namespaceWindowsFormsApplication2
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;
//关闭线程检查
privatevoidForm1_Load(objectsender,EventArgse)
{//窗口载入时,自动搜索可用的串口
stringbuffer;
comboBox1.Items.Clear();
20;
try
buffer="
COM"
+i.ToString();
serialPort1.PortName=buffer;
serialPort1.Open();
comboBox1.Items.Add(buffer);
serialPort1.Close();
catch{}
serialPort1.WriteLine("
MONITOR@00SC0252*"
+"
\r"
//让PLC工作在监视模式下
//serialPort1.WriteLine("
@00WD0201000050*"
privatevoidserialPort1_DataReceived(objectsender,SerialDataReceivedEventArgse)
//串口接受事件所触发执行
if(radioButton1.Checked)
//如果处于运行状态,则接受的字符串只显示在接受数据去
//高级功能中的接受面板不予显示
stringstr=serialPort1.ReadExisting();
//接受到的字符
stringstr1;
//通道1的字符
//stringstr2;
//通道2的字符//该设备没有外接
stringstr3;
//通道3的字符
//stringstr4;
//通道4的字符//该设备没有外接
stringstr_Z_S_PLC;
//转速的字符PLC模块所采集的
str1=str.Substring(8,2);
catch
str1="
;
S_Y_1.Text=str1;
Application.DoEvents();
//System.Threading.Thread.Sleep(100);
str3=str.Substring(12,2);
str3="
S_Y_3.Text=str3;
/******************/
//让线程在此休眠100MS,以便处理
//其他线程的事情。
//这对刷屏,text属性用比较大的作用
S_Y_2.Text="
60"
S_Y_4.Text="
str_Z_S_PLC=str.Substring(15,3);
str_Z_S_PLC="
//str_Z_S_PLC=str.Substring(15,3);
S_B_Z_S.Text=str_Z_S_PLC;
else
stringstr_gaoji=serialPort1.ReadExisting();
textBox1.AppendText(str_gaoji);
privatevoidbutton2_Click(objectsender,EventArgse)
//高级功能中的发送按钮所执行的功能
if(serialPort1.IsOpen)
{
//若串口为打开状态则,发送命令
serialPort1.WriteLine(textBox2.Text);
MessageBox.Show("
数据写入有错"
"
错误"
//打开串口按钮执行的功能
//若串口原状态是开,再按一次则关闭穿口
button1.Text="
打开串口"
ovalShape1.FillColor=Color.Gray;
串口关闭错误"
//若串口状态原先是关闭,则按一次打开串口
serialPort1.PortName=comboBox1.Text;
关闭串口"
ovalShape1.FillColor=Color.GreenYellow;
串口打开错误"
privatevoidtimer1_Tick(objectsender,EventArgse)
//每隔1S,上位机给PLC发送一条指令
//PLC返回一条指令,用于刷新,各采集的数据
if(serialPor
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 实现 上位 欧姆 PLC 通信