C#与基恩士PLC的KV 您所在的位置:网站首页 基恩士plc很冷门 C#与基恩士PLC的KV

C#与基恩士PLC的KV

2023-04-01 16:19| 来源: 网络整理| 查看: 265

基恩士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))= 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                         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;                     }                     if (Pul1 / 10000 == 7)//提取第二位 并转换为ASC 说明值70000~79999 第2位为7                     {                         DM_0[17] = 0x37;                         Pul2 = Pul1 - 70000;                     }                     if (Pul1 / 10000 == 8)//提取第二位 并转换为ASC 说明值80000~89999 第2位为8                     {                         DM_0[17] = 0x38;                         Pul2 = Pul1 - 80000;                     }                     if (Pul1 / 10000 == 9)//提取第二位 并转换为ASC 说明值90000~99999 第2位为9                     {                         DM_0[17] = 0x39;                         Pul2 = Pul1 - 90000;                     }

                    if (Pul2 / 1000 == 0)//提取第3位 并转换为ASC 说明值小于1000 第3位为0                     {                         DM_0[18] = 0x30;                         Pul3 = Pul2;                     }                     if (Pul2 / 1000 == 1)//提取第3位 并转换为ASC 说明值1000~1999 第3位为1                     {                         DM_0[18] = 0x31;                         Pul3 = Pul2 - 1000;                     }                     if (Pul2 / 1000 == 2)//提取第3位 并转换为ASC 说明值2000~2999 第3位为2                     {                         DM_0[18] = 0x32;                         Pul3 = Pul2 - 2000;                     }                     if (Pul2 / 1000 == 3)//提取第3位 并转换为ASC 说明值3000~3999 第3位为3                     {                         DM_0[18] = 0x33;                         Pul3 = Pul2 - 3000;                     }                     if (Pul2 / 1000 == 4)//提取第3位 并转换为ASC 说明值4000~4999 第3位为4                     {                         DM_0[18] = 0x34;                         Pul3 = Pul2 - 4000;                     }                     if (Pul2 / 1000 == 5)//提取第3位 并转换为ASC 说明值5000~5999 第3位为5                     {                         DM_0[18] = 0x35;                         Pul3 = Pul2 - 5000;                     }                     if (Pul2 / 1000 == 6)//提取第3位 并转换为ASC 说明值6000~6999 第3位为6                     {                         DM_0[18] = 0x36;                         Pul3 = Pul2 - 6000;                     }                     if (Pul2 / 1000 == 7)//提取第3位 并转换为ASC 说明值7000~7999 第3位为7                     {                         DM_0[18] = 0x37;                         Pul3 = Pul2 - 7000;                     }                     if (Pul2 / 1000 == 8)//提取第3位 并转换为ASC 说明值8000~8999 第3位为8                     {                         DM_0[18] = 0x38;                         Pul3 = Pul2 - 8000;                     }                     if (Pul2 / 1000 == 9)//提取第3位 并转换为ASC 说明值9000~9999 第3位为9                     {                         DM_0[18] = 0x39;                         Pul3 = Pul2 - 9000;                     }

                    if (Pul3 / 100 == 0)//提取第4位 并转换为ASC 说明值小于100 第4位为0                     {                         DM_0[19] = 0x30;                         Pul4 = Pul3;                     }                     if (Pul3 / 100 == 1)//提取第4位 并转换为ASC 说明值100~199 第4位为1                     {                         DM_0[19] = 0x31;                         Pul4 = Pul3 - 100;                     }                     if (Pul3 / 100 == 2)//提取第4位 并转换为ASC 说明值200~299 第4位为2                     {                         DM_0[19] = 0x32;                         Pul4 = Pul3 - 200;                     }                     if (Pul3 / 100 == 3)//提取第4位 并转换为ASC 说明值300~399 第4位为3                     {                         DM_0[19] = 0x33;                         Pul4 = Pul3 - 300;                     }                     if (Pul3 / 100 == 4)//提取第4位 并转换为ASC 说明值400~499 第4位为4                     {                         DM_0[19] = 0x34;                         Pul4 = Pul3 - 400;                     }                     if (Pul3 / 100 == 5)//提取第4位 并转换为ASC 说明值500~599 第4位为5                     {                         DM_0[19] = 0x35;                         Pul4 = Pul3 - 500;                     }                     if (Pul3 / 100 == 6)//提取第4位 并转换为ASC 说明值600~699 第4位为6                     {                         DM_0[19] = 0x36;                         Pul4 = Pul3 - 600;                     }                     if (Pul3 / 100 == 7)//提取第4位 并转换为ASC 说明值700~799 第4位为7                     {                         DM_0[19] = 0x37;                         Pul4 = Pul3 - 700;                     }                     if (Pul3 / 100 == 8)//提取第4位 并转换为ASC 说明值800~899 第4位为8                     {                         DM_0[19] = 0x38;                         Pul4 = Pul3 - 800;                     }                     if (Pul3 / 100 == 9)//提取第4位 并转换为ASC 说明值900~999 第4位为1                     {                         DM_0[19] = 0x39;                         Pul4 = Pul3 - 900;                     }

                    if (Pul4 / 10 == 0)//提取第5位 并转换为ASC 说明值小于10 第5位为0                     {                         DM_0[20] = 0x30;                         Pul5 = Pul4;                     }                     if (Pul4 / 10 == 1)//提取第5位 并转换为ASC 说明值10~19 第5位为1                     {                         DM_0[20] = 0x31;                         Pul5 = Pul4 - 10;                     }                     if (Pul4 / 10 == 2)//提取第5位 并转换为ASC 说明值20~29 第5位为2                     {                         DM_0[20] = 0x32;                         Pul5 = Pul4 - 20;                     }                     if (Pul4 / 10 == 3)//提取第5位 并转换为ASC 说明值30~39 第5位为3                     {                         DM_0[20] = 0x33;                         Pul5 = Pul4 - 30;                     }                     if (Pul4 / 10 == 4)//提取第5位 并转换为ASC 说明值40~49 第5位为4                     {                         DM_0[20] = 0x34;                         Pul5 = Pul4 - 40;                     }                     if (Pul4 / 10 == 5)//提取第5位 并转换为ASC 说明值50~59 第5位为5                     {                         DM_0[20] = 0x35;                         Pul5 = Pul4 - 50;                     }                     if (Pul4 / 10 == 6)//提取第5位 并转换为ASC 说明值60~69 第5位为6                     {                         DM_0[20] = 0x36;                         Pul5 = Pul4 - 60;                     }                     if (Pul4 / 10 == 7)//提取第5位 并转换为ASC 说明值70~79 第5位为7                     {                         DM_0[20] = 0x37;                         Pul5 = Pul4 - 70;                     }                     if (Pul4 / 10 == 8)//提取第5位 并转换为ASC 说明值80~89 第5位为8                     {                         DM_0[20] = 0x38;                         Pul5 = Pul4 - 80;                     }                     if (Pul4 / 10 == 9)//提取第5位 并转换为ASC 说明值90~99 第5位为9                     {                         DM_0[20] = 0x39;                         Pul5 = Pul4 - 90;                     }

                    if (Pul5 == 0)//提取第6位 并转换为ASC  最后1位 0~9                     {                         DM_0[21] = 0x30;//                     }                     if (Pul5 == 1)//                     {                         DM_0[21] = 0x31;//                     }                     if (Pul5 == 2)//                     {                         DM_0[21] = 0x32;//                     }                     if (Pul5 == 3)//                     {                         DM_0[21] = 0x33;//                     }                     if (Pul5 == 4)//                     {                         DM_0[21] = 0x34;//                     }                     if (Pul5 == 5)//                     {                         DM_0[21] = 0x35;//                     }                     if (Pul5 == 6)//                     {                         DM_0[21] = 0x36;//                     }                     if (Pul5 == 7)//                     {                         DM_0[21] = 0x37;//                     }                     if (Pul5 == 8)//                     {                         DM_0[21] = 0x38;//                     }                     if (Pul5 == 9)//                     {                         DM_0[21] = 0x39;//                     }

                }                 else//设置数据超过20cm越限了   当作5cm处理  050000                 {                     DM_0[16] = 0x30; DM_0[17] = 0x35; DM_0[18] = 0x30; DM_0[19] = 0x30; DM_0[20] = 0x30; DM_0[21] = 0x30;                     MessageBox.Show("位置越限,只移动到5cm处!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);                 }                 DM_0[22] = 0x20;//空格的ASC码

                //写数据3  DM4DM5  数据无意义 写0                 DM_0[23] = 0x30;                 DM_0[24] = 0x20;//空格的ASC码

                //写数据4  DM6DM7  数据无意义 写0                 DM_0[25] = 0x30;                 DM_0[26] = 0x20;//空格的ASC码

                //写数据5 速度 DM8DM9  限制输入0100~9999                 Sud = Convert.ToUInt16(textBox4.Text);//取出输入的速度                 if (Sud / 1000 == 0)//提取第1位                 {                     DM_0[27] = 0x30;//0的ASC码                     Sud1 = Sud;                 }                 if (Sud / 1000 == 1)                 {                     DM_0[27] = 0x31;//                     Sud1 = (ushort)(Sud - 1000);                 }                 if (Sud / 1000 == 2)                 {                     DM_0[27] = 0x32;//                     Sud1 = (ushort)(Sud - 2000);                 }                 if (Sud / 1000 == 3)                 {                     DM_0[27] = 0x33;//                     Sud1 = (ushort)(Sud - 3000);                 }                 if (Sud / 1000 == 4)                 {                     DM_0[27] = 0x34;//                     Sud1 = (ushort)(Sud - 4000);                 }                 if (Sud / 1000 == 5)                 {                     DM_0[27] = 0x35;//                     Sud1 = (ushort)(Sud - 5000);                 }                 if (Sud / 1000 == 6)                 {                     DM_0[27] = 0x36;//                     Sud1 = (ushort)(Sud - 6000);                 }                 if (Sud / 1000 == 7)                 {                     DM_0[27] = 0x37;//                     Sud1 = (ushort)(Sud - 7000);                 }                 if (Sud / 1000 == 8)                 {                     DM_0[27] = 0x38;//                     Sud1 = (ushort)(Sud - 8000);                 }                 if (Sud / 1000 == 9)                 {                     DM_0[27] = 0x39;//                     Sud1 = (ushort)(Sud - 9000);                 }

                if (Sud1 / 100 == 0)//提取第2位                 {                     DM_0[28] = 0x30;//0的ASC码                     Sud2 = Sud1;                 }                 if (Sud1 / 100 == 1)                 {                     DM_0[28] = 0x31;//                     Sud2 = (ushort)(Sud1 - 100);                 }                 if (Sud1 / 100 == 2)                 {                     DM_0[28] = 0x32;//                     Sud2 = (ushort)(Sud1 - 200);                 }                 if (Sud1 / 100 == 3)                 {                     DM_0[28] = 0x33;//                     Sud2 = (ushort)(Sud1 - 300);                 }                 if (Sud1 / 100 == 4)                 {                     DM_0[28] = 0x34;//                     Sud2 = (ushort)(Sud1 - 400);                 }                 if (Sud1 / 100 == 5)                 {                     DM_0[28] = 0x35;//                     Sud2 = (ushort)(Sud1 - 500);                 }                 if (Sud1 / 100 == 6)                 {                     DM_0[28] = 0x36;//                     Sud2 = (ushort)(Sud1 - 600);                 }                 if (Sud1 / 100 == 7)                 {                     DM_0[28] = 0x37;//                     Sud2 = (ushort)(Sud1 - 700);                 }                 if (Sud1 / 100 == 8)                 {                     DM_0[28] = 0x38;//                     Sud2 = (ushort)(Sud1 - 800);                 }                 if (Sud1 / 100 == 9)                 {                     DM_0[28] = 0x39;//                     Sud2 = (ushort)(Sud1 - 900);                 }

                if (Sud2 / 10 == 0)//提取第3位                 {                     DM_0[29] = 0x30;                     Sud3 = Sud2;                 }                 if (Sud1 / 10 == 1)                 {                     DM_0[29] = 0x31;//                     Sud3 = (ushort)(Sud2 - 10);                 }                 if (Sud1 / 10 == 2)                 {                     DM_0[29] = 0x32;//                     Sud3 = (ushort)(Sud2 - 20);                 }                 if (Sud1 / 10 == 3)                 {                     DM_0[29] = 0x33;//                     Sud3 = (ushort)(Sud2 - 30);                 }                 if (Sud1 / 10 == 4)                 {                     DM_0[29] = 0x34;//                     Sud3 = (ushort)(Sud2 - 40);                 }                 if (Sud1 / 10 == 5)                 {                     DM_0[29] = 0x35;//                     Sud3 = (ushort)(Sud2 - 50);                 }                 if (Sud1 / 10 == 6)                 {                     DM_0[29] = 0x36;//                     Sud3 = (ushort)(Sud2 - 60);                 }                 if (Sud1 / 10 == 7)                 {                     DM_0[29] = 0x37;//                     Sud3 = (ushort)(Sud2 - 70);                 }                 if (Sud1 / 10 == 8)                 {                     DM_0[29] = 0x38;//                     Sud3 = (ushort)(Sud2 - 80);                 }                 if (Sud1 / 10 == 9)                 {                     DM_0[29] = 0x39;//                     Sud3 = (ushort)(Sud2 - 90);                 }

                if (Sud3 == 0)//提取第4位 最后1位                 {                     DM_0[30] = 0x30;                                     }                 if (Sud3 == 1)                 {                     DM_0[30] = 0x31;                 }                 if (Sud3 == 2)                 {                     DM_0[30] = 0x32;                 }                 if (Sud3 == 3)                 {                     DM_0[30] = 0x33;                 }                 if (Sud3 == 4)                 {                     DM_0[30] = 0x34;                 }                 if (Sud3 == 5)                 {                     DM_0[30] = 0x35;                 }                 if (Sud3 == 6)                 {                     DM_0[30] = 0x36;                 }                 if (Sud3 == 7)                 {                     DM_0[30] = 0x37;                 }                 if (Sud3 == 8)                 {                     DM_0[30] = 0x38;                 }                 if (Sud3 == 9)                 {                     DM_0[30] = 0x39;                 }                 DM_0[31] = 0x0D;             }             else                 MessageBox.Show("请输入正确参数!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);

              if (serialPort1.IsOpen == true)//如果串口确实被打开了 则执行发送命令                 serialPort1.Write(DM_0, 0, 32);//发送数组

3、读输入R0~R7

      private void timer2_Tick(object sender, EventArgs e)//800ms 读输入R0~R07的状态   与光电开关有关 读8个 返回17字节         {             //格式均为[R D S 空格 软元件类型 软元件编号 数据格式 空格 读取个数 C]   读R 数据格式可以省略,此时表示位                               byte[] R_000 = new byte[] { 0x52,0x44,0x53,0x20,0x52,0x30,0x30,0x30,0x20,0x38,0x0d};                      if (serialPort1.IsOpen == true)                 serialPort1.Write(R_000, 0, 11);

            System.Threading.Thread.Sleep(50);//单位ms         }

4、读MR000~MR006

      private void timer4_Tick(object sender, EventArgs e)//2400ms  读MR000~MR06的状态  与轴控制 状态有关 读7个 返回15字节         {             byte[] M_000 = new byte[] { 0x52, 0x44, 0x53, 0x20, 0x4D, 0x52, 0x30, 0x30, 0x30, 0x20, 0x37, 0x0d };                        if (serialPort1.IsOpen == true)                 serialPort1.Write(M_000, 0, 12);

            System.Threading.Thread.Sleep(50);//单位ms         }

5、读DM50~DM55

      private void timer7_Tick(object sender, EventArgs e)//4800ms 读DM50~DM55   轴实时位置 脉冲 无符号 读3个32位数 返回34字节         {             byte[] DM_50 = new byte[] { 0x52, 0x44, 0x53, 0x20, 0x44, 0x4D, 0x35, 0x30, 0x2E, 0x44, 0x20, 0x33, 0x0d };             if (serialPort1.IsOpen == true)                 serialPort1.Write(DM_50, 0, 13);

            System.Threading.Thread.Sleep(50);//单位ms         }

看完小伙伴们有没有学会呢?有什么问题都可以问我。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有