三菱FX3U系列PLC网络通信

三菱FX3U系列PLC网络通信(MC1E帧),封装方法如下:

1.方法一

 public class SvMitsubishiMC1E 
    {

        private SvSocketClient Client;      
        string fbt = "01";//"00";未读//"01"批量读
        string plchao = "FF";
        string time = "0A00";//L_H
        string start = "";
        string A_dress = "";
        string count = "";
        string r_or_w = "";

        public override void Initial()
        {
            base.Initial();
            Client = new SvSocketClient(Host, "PLC");
            Client.Initial();
        }

        public override void Close()
        {
            Client.Close();
        }

        public override void ReadBlock16(string startAddress, ref short[] addressValues)
        {
            var addrType = startAddress.Substring(0, 1);
            var startAddr = Convert.ToInt32(startAddress.Substring(1, startAddress.Length - 1));

            fbt = "01";
            start = startAddr.ToString("X8");
            start = start.Substring(6, 2) + start.Substring(4, 2) + start.Substring(2, 2) + start.Substring(0, 2);
            A_dress = (GetAddrTypeByte(addrType)).ToString("X4");
            A_dress = A_dress.Substring(2, 2) + A_dress.Substring(0, 2);
            count = addressValues.Length.ToString("X2");
            r_or_w = "00";
            string str = string.Format("{0}{1}{2}{3}{4}{5}{6}", fbt, plchao, time, start, A_dress, count, r_or_w);

            byte[] OML = new byte[str.Length / 2];

            for (int I = 0; I < OML.Length; I++)
            {
                OML[I] = Convert.ToByte(str.Substring(2 * I, 2), 16);
            }                                                            
            // 發送數據
            var recByte = Client.SendData(OML);          
            // 數據解析
            //for (int i = 0; i < addressValues.Length; i++)
            //{
            //    addressValues[i] = BitConverter.ToInt16(recByte, 11 + i * 2);
            //}
            for (int i = 0; i < addressValues.Length; i++)
            {
                string SS = recByte[2 * i + 3].ToString("x2").ToUpper();
                string FDDS = recByte[2 * i + 2].ToString("x2").ToUpper();
                addressValues[i] = Convert.ToInt16(recByte[2 * i + 3].ToString("x2").ToUpper() + recByte[2 * i + 2].ToString("x2").ToUpper(), 16);
            }
        }

       
        public override void WriteBlock16(string startAddress, short[] addressValues)
        {
            var addrType = startAddress.Substring(0, 1);
            var startAddr = Convert.ToInt32(startAddress.Substring(1, startAddress.Length - 1));

            byte[] bu_write = new byte[addressValues.Length * 2];
            for (int i = 0; i < addressValues.Length; i++)
            {
                bu_write[i * 2] = Convert.ToByte(addressValues[i].ToString("X4").Substring(2, 2), 16);
                bu_write[2 * i + 1] = Convert.ToByte(addressValues[i].ToString("X4").Substring(0, 2), 16);
            }
            fbt = "03";
            start = startAddr.ToString("X8");
            start = start.Substring(6, 2) + start.Substring(4, 2) + start.Substring(2, 2) + start.Substring(0, 2);
            A_dress = (GetAddrTypeByte(addrType)).ToString("X4");
            A_dress = A_dress.Substring(2, 2) + A_dress.Substring(0, 2);
            count = addressValues.Length.ToString("X2");
            r_or_w = "00";
            string str = "";
            str = string.Format("{0}{1}{2}{3}{4}{5}{6}", fbt, plchao, time, start, A_dress, count, r_or_w);

            byte[] buffer = new byte[str.Length / 2 + addressValues.Length * 2];// NEWSystem.Text.Encoding.ASCII.GetBytes(str);
            for (int i = 0; i < str.Length / 2 + addressValues.Length * 2; i++)
            {
                if (i < str.Length / 2)
                {
                    buffer[i] = (byte)Convert.ToByte(str.Substring(i * 2, 2), 16);
                }
                else
                {
                    buffer[i] = Convert.ToByte(addressValues[(i - str.Length / 2) / 2].ToString("X4").Substring(2, 2), 16);
                    i++;
                    buffer[i] = Convert.ToByte(addressValues[(i - 1 - str.Length / 2) / 2].ToString("X4").Substring(0, 2), 16);

                }
            }
            string[] ASD = new string[buffer.Length];
            for (int I = 0; I < ASD.Length; I++)
            {
                ASD[I] = buffer[I].ToString("X2");
            }
            // 發送數據
            var recByte = Client.SendData(buffer);
        }      

        private int GetAddrTypeByte(string addrType)
        {
            switch (addrType)
            {
                case "D": return 17440;
                case "M": return 19744;
                case "R": return 21024;
                case "SM": return 145;              
                default: return 145;                
            }

        }
    }

2.方法二

 public class SvMitsubishiMC1E 
    {
        private Socket Client;
        private string Host;       
        string fbt = "01";//"00";未读//"01"批量读
        string plchao = "FF";
        string time = "0A00";//L_H
        string start = "";
        string A_dress = "";
        string count = "";
        string r_or_w = "";
       
        public SvMitsubishiMC1E(string host)
        {
            Host = host;
        }

        public void Initial()
        {
            try
            {
                Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                Client.SendTimeout = 10000;
                Client.ReceiveTimeout = 10000;
                Client.Connect(ConvertIP(Host));
            }
            catch (Exception ex)
            {
                //SvMaster.Log.WriteError(Name + "建立連接" + Host +
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

susan花雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值