基恩士PLC的通讯协议比较简单,通过自带的串口,接一根转USB插到电脑上即可,协议如下:
通讯开始需要建立通讯,代码为:serialPort1.Write(0x43,0x52,0x0d, 0, 3);之后可以进行对PLC内部元件的读写操作;
1、SET MR000
byte[] MR_000 = new byte[9] { 0x53, 0x54, 0x20,0x4d,0x52,0x30,0x30,0x30,0x0d };//指令含义 [S T 空格 M R 0 0 0 C]的ASC码 16进制
if (serialPort1.IsOpen == true)//如果串口确实被打开了 则执行发送命令
serialPort1.Write(MR_000, 0, 9);//发送数组MR[0]开始的9个字节 set MR000
else
MessageBox.Show("PLC没连接,请连接后再操作!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
2、连写DM0~DM9
byte[] DM_0 = new byte[32];//装入设定值 DM0DM1方式
if ((((Convert.ToUInt16(textBox4.Text))<=9999)&& ((Convert.ToUInt16(textBox4.Text)) >= 100)) && (textBox5.Text != ""))//先判断有没有输入
{ //速度设置100~9999 位置不能设置空
//一次连写DM0~DM9 D0为定位方式0或1 D2D3是位置 D8D9速度 其余无意义
//格式:[W R S 空格 D M 0 0 0 . D 空格 5 空格 数据1 空格 数据2 空格 数据3 空格 数据4 空格 数据5 CR] 均要转化成ASC 16进制
DM_0[0] = 0x57;//W的ASC码
DM_0[1] = 0x52;//R的ASC码
DM_0[2] = 0x53;//S的ASC码
DM_0[3] = 0x20;//空格的ASC码
DM_0[4] = 0x44;//D的ASC码
DM_0[5] = 0x4D;//M的ASC码
DM_0[6] = 0x30;//0的ASC码
DM_0[7] = 0x30;//0的ASC码
DM_0[8] = 0x30;//0的ASC码
DM_0[9] = 0x2E;//.的ASC码
DM_0[10] = 0x44;//D的ASC码
DM_0[11] = 0x20;//空格的ASC码
DM_0[12] = 0x35;//5的ASC码
DM_0[13] = 0x20;//空格的ASC码
//写数据1 DM0 定位方式 DM1没用到写什么都可以 .D代表无符号32位数据 相对定位写0 绝对定位写1 合起来就是 0/1
DM_0[14] = 0x31;//1的ASC码 只允许绝对定位
DM_0[15] = 0x20;//空格的ASC码
//写数据2 DM2 DM3 目标位置cm转化为um 无符号32位 限制目标范围0~20cm,范围000000~200000um 要根据实际来取值,相当于软限位
Pul = (UInt32)(10000*Convert.ToDouble(textBox5.Text));//取出输入的位置 注意是无符号
if (Pul <= 200000)//输入小于20cm正常处理
{
if (Pul / 100000 == 0)//提取最高位 并转换为ASC 说明值小于100000 第一位为0
{
DM_0[16] = 0x30;//0的ASC码
Pul1 = Pul;
}
if (Pul / 100000 == 1)//提取最高位 并转换为ASC 说明值100000~199999 第一位为1
{
DM_0[16] = 0x31;//1的ASC码
Pul1 = Pul - 100000;
}
if (Pul / 100000 == 2)//提取最高位 并转换为ASC 说明值200000 第一位为2
{
DM_0[16] = 0x32;
Pul1 = Pul - 200000;
}
if (Pul1 / 10000 == 0)//提取第二位 并转换为ASC 说明值小于10000 第2位为0
{
DM_0[17] = 0x30;
Pul2 = Pul1;
}
if (Pul1 / 10000 == 1)//提取第二位 并转换为ASC 说明值10000~19999 第2位为1
{
DM_0[17] = 0x31;
Pul2 = Pul1 - 10000;
}
if (Pul1 / 10000 == 2)//提取第二位 并转换为ASC 说明值20000~29999 第2位为2
{
DM_0[17] = 0x32;
Pul2 = Pul1 - 20000;
}
if (Pul1 / 10000 == 3)//提取第二位 并转换为ASC 说明值30000~39999 第2位为3
{
DM_0[17] = 0x33;
Pul2 = Pul1 - 30000;
}
if (Pul1 / 10000 == 4)//提取第二位 并转换为ASC 说明值40000~49999 第2位为4
{
DM_0[17] = 0x34;
Pul2 = Pul1 - 40000;
}
if (Pul1 / 10000 == 5)//提取第二位 并转换为ASC 说明值50000~59999 第2位为5
{
DM_0[17] = 0x35;
Pul2 = Pul1 - 50000;
}
if (Pul1 / 10000 == 6)//提取第二位 并转换为ASC 说明值60000~69999 第2位为6
{
DM_0[17] = 0x36;
Pul2 = Pul1 - 60000;
}