当前位置: 代码迷 >> C# >> PC与PLC通信求解!
  详细解决方案

PC与PLC通信求解!

热度:365   发布时间:2016-05-05 02:51:14.0
PC与PLC通讯求解!~~
需求:PC将十进制数2010以byte数组形式发送给PLC

PLC接收设置:PLC哪边只能接收二进制数据或是十六进制,二进制每次接收的长度是双字(也就是32bit)。
比如十进制2010,plc格式会是(00000000    00000000      00000111      11011010),plc读的长度可以设置(字,双字)

PC发送过程:使用用PC端TcpClinetSend(byte[] var)函数发送出去。

问题:请问该怎么将2010转换byte数组,一次性发32位长度的数据给他,如果高位没有就补0


我试过:如果我两位给他好像可以:byte[] date= new byte[] { 11 };byte[] date= new byte[] { 2, 1, 0, 1, 0 };Plc解出来的数据很大。
------解决思路----------------------
byte[] byData = BitConverter.GetByte((int)2010)
------解决思路----------------------
byte[] byData = BitConverter.GetByte(2010)
------解决思路----------------------
引用:
追问,如果我要发送有符号和小数点的十进制坐标数据怎么转换,PLC数据长度可以设置,比如PC要发送的数据是:
第一个32位,X是:-2010.11 
第二个32位,是:,
第三个32位,Y是:2018.22,
第四个32位,是:,
第五个32位,R是:-2019.55
XYR中间用逗号分隔
byte[] byData = BitConverter.GetByte((int)-2010.11,2018.22,-2019.55);发送数据需要怎么转换??

你自己不会看 GetByte 的重载吗?
还有 不知道你是要分五次发送完成还是 一次发送完成
如果是五次 你调用五次 GetByte 然后Send 不就可以了?
如果你是要一次 发送完成 那么 把5个byte[] 合并成 一个 byte[] 都不会吗?
那么 你还是 重新去看看书吧。。。
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

追问,如果我要发送有符号和小数点的十进制坐标数据怎么转换,PLC数据长度可以设置,比如PC要发送的数据是:
第一个32位,X是:-2010.11 
第二个32位,是:,
第三个32位,Y是:2018.22,
第四个32位,是:,
第五个32位,R是:-2019.55
XYR中间用逗号分隔
byte[] byData = BitConverter.GetByte((int)-2010.11,2018.22,-2019.55);发送数据需要怎么转换??

你自己不会看 GetByte 的重载吗?
还有 不知道你是要分五次发送完成还是 一次发送完成
如果是五次 你调用五次 GetByte 然后Send 不就可以了?
如果你是要一次 发送完成 那么 把5个byte[] 合并成 一个 byte[] 都不会吗?
那么 你还是 重新去看看书吧。。。


        public void clientsend(byte[] value)
        {
 
        }

        public static byte[] copybyte(byte[] a, byte[] b,byte[] c)
        {
            byte[] d = new byte[a.Length + b.Length + c.Length];
            a.CopyTo(d, 0);
            b.CopyTo(d, a.Length);
            c.CopyTo(d, a.Length + b.Length);
            return d;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            double X = -2010.11;
            double Y = 2018.22;
            double R = -2019.55;
            char ch = ',';
          byte[] by_x=  BitConverter.GetBytes(X);
          byte[] by_y = BitConverter.GetBytes(Y);
          byte[] by_r = BitConverter.GetBytes(R);
          byte[] bySum=copybyte(by_x, by_y, by_r);
          clientsend(bySum);
       
        }


兄弟不要生气,我写了一个你帮我看看,然后,我主要是队PLC哪边的接收不太懂,比如二进制里面怎么判断符号(+.-)不太理解啊,

二进制 只是一堆数据 不存在什么 + - 之类的符号不符号
11111111 如果你把它当作无符号 那么他就是 255 如果你当作有符号 那么他就是 -1
 就像 165只是一个数字 可能是一个人的身高 也可能是一个公交车牌 取决于你把它当作什么来处理 记得以前看 数据结构 里面说的一样 计算机内存中所有的数据 如果你不赋予他一个结构 他都是没有意义的数据
还有你那个拷贝数据的函数 是不是写的太死板 只能组合3个?如果我要四个怎么办?或者 自由两个怎么办
写成  CopyByte(List<byte[]>) 这样 好歹要合理一点吧?
其实 还有一个很简单的方式
List<byte> lst = new List<byte>
lst.AddRange(BitConverter.GetByte(2010))
lst.Add......
byte[] byData = lst.ToArray();
  相关解决方案