C#与基恩士PLC的KV-Nano系列通讯

本文介绍了如何使用C#通过串口与基恩士KV-Nano系列PLC进行通讯,包括建立通讯、设置MR寄存器、连续写入DM寄存器的操作步骤和详细代码,涉及数据的转换和校验,同时提供了读取R、MR和DM寄存器状态的示例代码,适合了解和学习相关通讯协议的开发者参考。
摘要由CSDN通过智能技术生成

基恩士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;
                    }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值