参考视频C#连接S71200PLC
参考资料
目录
- 前言
- 一、使用工具
- 二、博图PLC
- 三、VS控制台连接
- Step1 新建项目
- Step2. 编写
- 补充:DB块知识
- 特别注意
- 四、VS的窗口连接
- 1. 创建Windows窗体项目
- 2. 配置连接
- 3. 按钮进行读写控制
- `效果展示`
- `开关按钮`
- `定时器`
- `修改数据按钮`
- `显示文本`
- C#中的部分问题解决【持续补充
- 1. textbox无法调整大小
- 2. Boolean对象强制转换String对象错误
- 3. Read()方法使用
- 4. Write()方法使用
- 更新时间线
前言
学习完了如何用LabVIEW连接PLC后,进行下一步如何使用C#连接PLC。
这里会进行”控制台连接“和”窗口连接“两种方式。
一、使用工具
PLC_31">二、博图PLC
PLC_32">1.创建好PLC设备
Step1. 创建新设备
Step2. 自动配置CPU
- 对于创建的空白CPU,我们直接点击“获取”。【这里的前提是,已经有实体PLC,并且PLC通过网线和电脑相连接】。
- 在新界面中,选择好接口,点击搜索,最后点击检测,就能实现根据实际PLC硬件来配备CPU。
Step3. 配置IP协议和连接机制
PLCPLCSimPLC_43">隐藏步骤:重置解决PLC硬件版本和PLCSim创建的PLC版本不兼容
点击“在线连接”后,会自动断开,并出现下面的标志,就代表版本不兼容。
首先,选择CPU,右击“更改设备“,擦看版本是否对。我这里明显需要4.2版本的。【这里版本需要小伙伴自己确认】
之后点击”在线“查看
如果还是没解决,那么最后一招:重置
Step4. 通过HslDemo来测试是否连通
Step5. 配置DB数据块【连通后才有意义,之后配置好后只需写入设备】
对数据块配备数据的时候,必须将属性中的优化和指定访问可去掉。
问题:如何将DB块下载到设备中
【如下图】我遇到了DB块下载不进设备中的问题:
右击“数据块_1[DB1]”,选择实际值的快照。
【第二次下载数据到设备中时,将出现下面数据库重新初始化的问题】
这里可以先选择”将快照值复制到起始值中“
三、VS控制台连接
Step1 新建项目
对于新建的项目,添加个S7.net插件。【下图所示:
在项目文件中导入using S7.Net;
编写测试连接程序:
上面的Read()方法只是简单演示,这么用不够高效,可以看Read()方法使用
结果显示为:
Step2. 编写
依据
Read()方法使用
结合我在PLC中DB块中设置的内容,C#编程中的Read()内容修改为如下【个人认为比DBX,DBB,DBW这些表示好懂多了】
using S7.Net;namespace C__Link_S71200
{internal class Program{//实例化的同时,建立和PLC的连接static Plc my1200 = new Plc(CpuType.S71200,"192.168.0.10",0,1);static void Main(string[] args){my1200.Open();do{int db = 1;var readValue = my1200.Read(DataType.DataBlock,db,2,VarType.Int,1);Console.WriteLine($"从偏移量为2的位置开始,读取1个Int类型的数据,值为:{readValue}");readValue = my1200.Read(DataType.DataBlock, db, 4, VarType.Int, 1);Console.WriteLine($"从偏移量为4的位置开始,读取1个Int类型的数据,值为:{readValue}");Thread.Sleep(3000);Console.Clear();} while (true);}}
}
我的VS运行后的结果为:
补充:DB块知识
参考文章:《西门子DB》
-
DB数据块
-
DB100:指编号为100的数据块;
- DBX0.0:在数据块中,第一个字的第一个位。
- DB100.DBX0.0:编号为100的数据块中,第一个字节的第一位的值
-
DBW2,第二个字,一个字2个字节,共16位。存储Int数据。
DBX0,一个字节,存储Bool类型数据。
DB0,32位,存储Real类型数据。
特别注意
- 编程中的int是32位。而PLC中的Int和Word型都是16位。【天坑】
四、VS的窗口连接
1. 创建Windows窗体项目
2. 配置连接
3. 按钮进行读写控制
效果展示
开关按钮
- 功能:控制PLC连接,依据是否连接更改按钮的颜色
- 绿色代表连接上;灰色表示未连接上【这一步在定时器中做了,也可以在按钮中做】
代码 :
private void button1_Click(object sender, EventArgs e){//关闭连接,按钮变银色;建立连接,按钮变绿色【颜色变化在定时器中做了,也可以在这里的按钮做】if (my1200.IsConnected){my1200.Close();}else{my1200.Open();}}
定时器
- 功能:设定多长时间后执行什么动作。
- 这里设定500ms后进行连接按钮的颜色变化。-
代码:
private void timer1_Tick(object sender, EventArgs e){if (my1200.IsConnected){button1.BackColor = Color.Green;button1.Text = "已连接";}else{button1.BackColor = Color.Gray;button1.Text = "未连接";}}
修改数据按钮
- 功能:根据点击按钮,实现更改DB块中DB1.DBX0.0的位置的值
private void button2_Click(object sender, EventArgs e){bool value = (bool)my1200.Read("DB1.DBX0.0");//更改后的值为1,那么按钮显示绿色,否则显示为灰色。button2.BackColor = !value ? Color.Green : Color.Gray;my1200.Write("DB1.DBX0.0", !value);textBox1.Text = "DB1.DBX0.0的值:" + my1200.Read("DB1.DBX0.0").ToString();}
显示文本
- 功能:显示文本内容。这里面我们不用写任何代码,直接用textBox1.Text直接赋值即可。调用代码已经在上面的"修改数据按钮"的代码中出现了。
C#中的部分问题解决【持续补充
1. textbox无法调整大小
2. Boolean对象强制转换String对象错误
解决方法:
用ToString()解决
textBox1.Text = my1200.Read("DB1.DBX0.0").ToString();
3. Read()方法使用
参考文章c#使用s7netplus读取plc数据
其中:
- db=1,代表DB1
- DataBlock是默认值
简单用例:
单个值读写
int db = 1;
//读取bool
//参数分别为数据块类型,数据块,偏移量,读取类型,读取个数
var boolDemo = plc.Read(DataType.DataBlock, db, 0, VarType.Bit, 1);Console.WriteLine("bool值打印:" + boolDemo);//写入bool
plc.Write(DataType.DataBlock, db, 0, false);//false表示写入的值
多个值读写【数组
short[] arr_short_int = new short[10];arr_short_int = (short[])my1200.Read(DataType.DataBlock, db, 2, VarType.Int, 10);Console.WriteLine("从偏移量为2的位置开始,连续读取10个数据,值为:");
foreach(var value in arr_short_int){Console.WriteLine(value);}
4. Write()方法使用
特别注意:plc中的int是c#中的short,所以需要进行类型转换,否则将赋0
正确写入如下:
PLC的Int型
my1200.Write(DataType.DataBlock, db, 2, (short)66);readValue = my1200.Read(DataType.DataBlock, db, 2, VarType.Int, 1);
Console.WriteLine($"从偏移量为2的位置开始,读取1个Int类型的数据,值为:{readValue}");
我的visual studio运行效果为:
PLC的Real型
不强转的话,就是默认是double型的62.6,double是64位;而Real是32位。
my1200.Write(DataType.DataBlock, db, 62, (float)62.5);
更新时间线
- 2024-07-11:创建
- 2024-07-12:VS控制台连接编写
- 2024-07-15:窗口编程中的textBox无法修改该部件的大小。实际案例。
- 2024-07-16:补充Real型的Write写法