繁体   English   中英

C#中通过TCP套接字方法发送位类型数据

[英]Sending a bit type data through TCP socket method in C#

这是我第一次在这个平台提问。 随意指出我应该做什么或避免什么才能变得更好,谢谢。

我正在尝试将 Struct 对象发送到 MES(制造执行系统)以更改工作站的状态。 这是数据结构(2.2)的说明:

1

下面的 C# 代码就是我所做的。 我确定我连接到MES系统但状态没有改变,我认为原因可能与我传输的数据格式有关。

using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;
using TcpClient = NetCoreServer.TcpClient;


//the Struct of data
[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct StateOfRobotino
{
    public int ResourceID;
    public byte SPSType;
    public byte State_info;
}


StateOfRobotino robotino10 = new StateOfRobotino();
robotino10.ResourceID = 10;
robotino10.SPSType = 2;
robotino10.State_info = 0b10000001; //MES mode, Auto
byte[] b_robotino10 = getBytes(robotino10);


//Convert Struct type to byte array through Marshal
byte[] getBytes(StateOfRobotino str)
        {
            int size = Marshal.SizeOf(str);
            byte[] arr = new byte[size];

            IntPtr ptr = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(str, ptr, true);
            Marshal.Copy(ptr, arr, 0, size);
            Marshal.FreeHGlobal(ptr);
            return arr;
        }

我怀疑的一件事是我的 Struct 中的第三个数据,我可以只使用一个字节(State_info)来表示 8 位数据吗? 如果不是,我该怎么办? 或者有没有其他方法可以尝试传输此类数据? 谢谢你。

获取字节数组的编组方法应该可以工作。

现在进入你的数据结构:

ResourceID  Int   0
SPSType     Byte  2
Auto Mode   Bit   3.0
...         Bit   3.n
MES Mode    Bit   3.7

我提请您注意包含 0、2 和 3.x 的数字列

  1. ResourceID看起来占用字节 0 和 1 Int两个字节表示您的 PLC 是 16 位的。 C# 的int是 32 位的,占用四个字节。 您需要明确指定Int16UInt16 (可能是未签名的UInt16 ,除非您的 MES 期望来自 PLC 的负数)。

    它们也被称为shortushort ,但在处理外部系统时通过指定 16 位来更明确以尽量减少混淆总是好的。

  2. SPSType只是一个字节。

  3. 其余的标记为3.0 ... 3.7 这是占用字节 3 的 8 位 (0..7)的表示法。 这意味着,是的,您应该发送一个包含所有位的字节 请记住,位 0 是最右边的位,因此0b000000010b10000000 ,而0b10000000是 MESMode。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM