Visual Studio 2010--C#跟西门子1200通讯(Sharp7)⑥--数据写入
上期回顾(上2期主要编写了从PLC读取数据到缓冲区,再从缓冲区拿取需要的数据,并转换成C#格式):
本期开始写写入数据的过程,写入的过程跟读取正好相反,先把要写入的数据都集中到数组,然后在整体写入到PLC
1.0 先新建一个12个字节的数组用来存放,需要写入的值
//写入
var writeBuffer = new byte[12];
2.0 开始写入S7.SetBitAt(ref writeBuffer,0,0,true);往第一个字节的0位写1,S7.SetIntAt(writeBuffer,2,20);这一句的意思是往第三个字节2里面写入20,其他以此类推,注意要与你写入的PLC数据块的地址相匹配
//写入BOOL
S7.SetBitAt(ref writeBuffer,0,0,true);
S7.SetBitAt(ref writeBuffer,0,1,true);
//写入word
S7.SetIntAt(writeBuffer,2,20);
//写入real
S7.SetRealAt(writeBuffer, 4, (float)25.33);
//写入Dint
S7.SetDIntAt(writeBuffer,8,123456);
3.0 写入需要的数据到数组封装后,就要开始把封装后的数组,传送给PLC的数据库DB1的从地址0开始的数据,并判断是否传送成功
//写入数据块DB1,从地址0开始的12个字节,从writeBuffer写入
int writeReswlt = client.DBWrite(1, 0, writeBuffer.Length, writeBuffer);
if (writeReswlt == 0)//如果写入完成就OK,否则为error
{
Console.WriteLine("DB1 write ok");
}
else
{
Console.WriteLine("DB1 write error");
return;
}
4.0 保存,仍旧在断开连接那边打上断点,按F5调试,如果代码没有错误,PLC监控状态下,你就会看到如下图的数据
完整程序如下:
static void Main(string[] args)
{
var client = new S7Client();//创建S7客户端对象
int comectionResult = client.ConnectTo("192.168.0.1",0,1);//接受来次通讯的结果
if (comectionResult == 0)//如果为0就说明通信OK,如果不为0就说明不通
{
Console.WriteLine("comection ok");
}
else
{
Console.WriteLine("conection error");
return;
}
//创建38个字节的数组,用来读取PLC数据
var buffer = new byte[38];
//读取DB1的从地址0开始的38个字节的数据,读到buffer
int readResult = client.DBRead(1,0,buffer.Length,buffer);
if (readResult == 0)//如果等于0说明等于读取完成,否则读取不成功
{
Console.WriteLine("DB1 Read ok");
}
else
{
Console.WriteLine("DB1 Read error");
return;
}
//读取
//第一列是数据类型
bool db1dbx00 = S7.GetBitAt(buffer,0,0);
bool db1dbx01 = S7.GetBitAt(buffer, 0, 1);
//读取word
int db1dbw2 = S7.GetIntAt(buffer,2);
//读取real
double db1dbd4 = S7.GetRealAt(buffer, 4);
//读取Dint
int db1dbd8 = S7.GetDIntAt(buffer, 8);
//读取16进制数
uint db1dbd12 = S7.GetDWordAt(buffer,12);
ushort db1dbd14 = S7.GetWordAt(buffer,16);
//强制转换字符串类型,相当于PLC的16进制数,tostring()中要加“x”,不然仍旧是10进制数
string hexdb1dbd12 = db1dbd12.ToString("x");
string hexdb1dbd14 = db1dbd14.ToString("x");
//写入
var writeBuffer = new byte[12];
//写入BOOL
S7.SetBitAt(ref writeBuffer,0,0,true);
S7.SetBitAt(ref writeBuffer,0,1,true);
//写入word
S7.SetIntAt(writeBuffer,2,20);
//写入real
S7.SetRealAt(writeBuffer, 4, (float)25.33);
//写入Dint
S7.SetDIntAt(writeBuffer,8,123456);
//写入数据块DB1,从地址0开始的12个字节,从writeBuffer写入
int writeReswlt = client.DBWrite(1, 0, writeBuffer.Length, writeBuffer);
if (writeReswlt == 0)//如果写入完成就OK,否则为error
{
Console.WriteLine("DB1 write ok");
}
else
{
Console.WriteLine("DB1 write error");
return;
}
client.Disconnect();//断开
}