国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版)

這篇具有很好參考價(jià)值的文章主要介紹了C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、A-3E報(bào)文回顧

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC?

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC?具體細(xì)節(jié)請(qǐng)看:

C#上位機(jī)與三菱PLC的通信05--MC協(xié)議之QnA-3E報(bào)文解析

C#上位機(jī)與三菱PLC的通信06--MC協(xié)議之QnA-3E報(bào)文測(cè)試

2、為何要開發(fā)自己的通訊庫(kù) ??

?前面開發(fā)了自己的A-1E協(xié)議的通訊庫(kù),實(shí)現(xiàn)了數(shù)據(jù)的讀寫,對(duì)于封裝的通訊庫(kù),其實(shí)是一個(gè)dll文件,請(qǐng)看上節(jié)的dll文件,有了這個(gè)文件,就可以在項(xiàng)目中直接引用 。C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC

我們只要引用并調(diào)用相關(guān)的方法即可實(shí)現(xiàn)目的, 但寫一個(gè)通訊庫(kù)需要非凡的技術(shù),需要考慮的東西很多,比如擴(kuò)展性,通用性,等等之類的。通過封裝通訊庫(kù)達(dá)到更高的層次, 大師就是這樣鍛造出來的,接下來馬上安排A-3E協(xié)議的封裝,代碼是基于上節(jié)的基礎(chǔ)上添加。

?3、說干就干

1、添加類文件

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC

2、編寫核心的通信類A3E.cs

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC

A3E.cs完整代碼

using Mitsubishi.Communication.MC.Mitsubishi.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Mitsubishi.Communication.MC.Mitsubishi
{
    /// <summary>
    /// A3E報(bào)文通訊庫(kù)
    /// </summary>
    public class A3E : MelsecBase
    {
        byte _netCode = 0x00, _stationCode = 0x00;

        public A3E(string ip, short port, byte net_code = 0x00, byte station_code = 0x00) : base(ip, port)
        {
            _netCode = net_code;
            _stationCode = station_code;
        }

        #region 讀數(shù)據(jù)
        /// <summary>
        /// 讀取數(shù)據(jù)
        /// </summary>
        /// <typeparam name="T">讀取的數(shù)據(jù)類型</typeparam>
        /// <param name="address">存儲(chǔ)區(qū)地址</param>
        /// <param name="count">讀取長(zhǎng)度</param>
        /// <returns></returns>
        public Result<T> Read<T>(string address, short count)
        {
            AreaCode areaCode; string start;
            (areaCode, start) = this.AnalysisAddress(address);
            return Read<T>(areaCode, start, count);
        }

        /// <summary>
        /// 讀取數(shù)據(jù)
        /// </summary>
        /// <typeparam name="T">讀取的數(shù)據(jù)類型</typeparam>
        /// <param name="areaCode">存儲(chǔ)區(qū)代碼</param>
        /// <param name="startAddr">開始地址</param>
        /// <param name="count">讀取長(zhǎng)度</param>
        /// <returns></returns>
        public Result<T> Read<T>(AreaCode areaCode, string startAddr, short count)
        {
            Result<T> result = new Result<T>();
            try
            {
                // 連接
                var connectState = this.Connect();
                if (!connectState.IsSuccessed)
                {
                    throw new Exception(connectState.Message);
                }
                // 子命令(位/字)
                byte readCode = (byte)(typeof(T) == typeof(bool) ? 0x01 : 0x00);
                //開始地址
                List<byte> startBytes = this.StartToBytes(areaCode, startAddr);
                // 讀取長(zhǎng)度
                int typeLen = this.CalculatLength<T>();


                // 讀取報(bào)文
                List<byte> bytes = new List<byte>
                {
                    0x50,0x00,//請(qǐng)求副頭部,固定50 00
                    _netCode,// 網(wǎng)絡(luò)號(hào),根據(jù)PLC的設(shè)置
                    0xFF,//PLC編號(hào),固定值
                    0xFF,0x03,//目標(biāo)模塊IO編號(hào),固定FF 03
                    _stationCode,// 目標(biāo)模塊站號(hào) 
                    0x0C,0x00,  // 剩余字節(jié)長(zhǎng)度
                    0x0A,0x00,//PLC響應(yīng)超時(shí)時(shí)間,以250ms為單位計(jì)算 
                    0x01,0x04,// 成批讀取
                    readCode,0x00,// 字操作  0x0001 
                    startBytes[0],startBytes[1],startBytes[2],// 起始地址
                    (byte)areaCode,// 區(qū)域代碼 
                    (byte)(typeLen*count%256),
                    (byte)(typeLen*count/256%256) //長(zhǎng)度
                };
                //發(fā)送報(bào)文
                List<byte> dataBytes = this.Send(bytes, 0);
                //數(shù)據(jù)解析
                result.Datas = this.AnalysisDatas<T>(dataBytes, typeLen);
            }
            catch (Exception ex)
            {
                result = new Result<T>(false, ex.Message);
            }
            return result;
        }
        #endregion

        #region 寫數(shù)據(jù)

        /// <summary>
        /// 寫入數(shù)據(jù)
        /// </summary>
        /// <typeparam name="T">寫入的數(shù)據(jù)類型</typeparam>
        /// <param name="values">寫入的數(shù)據(jù)列表</param>
        /// <param name="address">開始地址</param>
        /// <returns></returns>
        public Result Write<T>(List<T> values, string address)
        {
            AreaCode areaCode; string start;
            (areaCode, start) = this.AnalysisAddress(address);
            return this.Write<T>(values, areaCode, start);
        }

        /// <summary>
        /// 寫入數(shù)據(jù)
        /// </summary>
        /// <typeparam name="T">寫入的數(shù)據(jù)類型</typeparam>
        /// <param name="values">寫入的數(shù)據(jù)列表</param>
        /// <param name="areaCode">存儲(chǔ)區(qū)代碼</param>
        /// <param name="address">開始地址</param>
        /// <returns></returns>
        public Result Write<T>(List<T> values, AreaCode areaCode, string startAddr)
        {
            Result result = new Result();

            try
            {
                // 連接
                var connectState = this.Connect();
                if (!connectState.IsSuccessed)
                {
                    throw new Exception(connectState.Message);
                }
                // 子命令(位/字)
                byte writeCode = (byte)(typeof(T) == typeof(bool) ? 0x01 : 0x00);

                // 起始地址  XY    直接翻譯  100   00 01 00    D100  64 00 00
                List<byte> startBytes = this.StartToBytes(areaCode, startAddr);
                //計(jì)算數(shù)據(jù)類型的長(zhǎng)度
                int typeLen = this.CalculatLength<T>();
                int count = values.Count;
                //計(jì)算數(shù)據(jù)的字節(jié)列表
                List<byte> datas = this.GetDataBytes<T>(values);
                List<byte> baseBytes = new List<byte>
                {
                    0x50,0x00,
                    this._netCode,// 可變,根據(jù)PLC的設(shè)置
                    0xFF,//PLC編號(hào),固定值
                    0xFF,0x03,//目標(biāo)模塊IO編號(hào),固定FF 03
                    this._stationCode,// 可變,目標(biāo)模塊站號(hào)
                };
                //0x0E,0x00,  // 剩余字節(jié)長(zhǎng)度
                List<byte> commandBytes = new List<byte> {
                    0x0A,0x00,//超時(shí)時(shí)間
                    0x01,0x14,// 成批寫入
                    writeCode,0x00,// 字操作
                    startBytes[0],startBytes[1],startBytes[2],// 起始地址
                    (byte)areaCode,// 區(qū)域代碼 
                    (byte)(typeLen*count%256),
                    (byte)(typeLen*count/256%256), //長(zhǎng)度
                };
                commandBytes.AddRange(datas);
                baseBytes.Add((byte)(commandBytes.Count % 256));
                baseBytes.Add((byte)(commandBytes.Count / 256 % 256));
                baseBytes.AddRange(commandBytes);
                socket.Send(baseBytes.ToArray());

                // 解析響應(yīng)
                byte[] respBytes = new byte[11];
                socket.Receive(respBytes, 0, 11, SocketFlags.None);

                // 狀態(tài)
                if ((respBytes[9] | respBytes[10]) != 0x00)
                {
                    throw new Exception("響應(yīng)異常。" + respBytes[9].ToString() + respBytes[10].ToString());
                }
            }
            catch (Exception ex)
            {
                result.IsSuccessed = false;
                result.Message = ex.Message;
            }

            return result;
        }
        #endregion

        #region 私有方法
        /// <summary>
        /// 地址解析
        /// </summary>
        /// <param name="address">地址字符串</param>
        /// <returns></returns>
        public Tuple<AreaCode, string> AnalysisAddress(string address)
        {
            // 取兩個(gè)字符
            string area = address.Substring(0, 2);
            if (!new string[] { "TN", "TS", "CS", "CN" }.Contains(area))
            {
                area = address.Substring(0, 1);
            }
            string start = address.Substring(area.Length);

            // 返回一個(gè)元組對(duì)象 
            return new Tuple<AreaCode, string>((AreaCode)Enum.Parse(typeof(AreaCode), area), start);
        }


        /// <summary>
        /// 發(fā)送報(bào)文
        /// </summary>
        /// <param name="reqBytes">字節(jié)列表</param>
        /// <param name="count"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public override List<byte> Send(List<byte> reqBytes, int count)
        {
            socket.Send(reqBytes.ToArray());
            // 解析
            byte[] respBytes = new byte[11];
            socket.Receive(respBytes, 0, 11, SocketFlags.None);

            // 狀態(tài)
            if ((respBytes[9] | respBytes[10]) != 0x00)
            {
                throw new Exception("響應(yīng)異常。" + respBytes[9].ToString() + respBytes[10].ToString());
            }
            // 數(shù)據(jù)長(zhǎng)度 
            int dataLen = BitConverter.ToUInt16(new byte[] { respBytes[7], respBytes[8] },0) - 2;  // -2 的意思去除響應(yīng)代碼(狀態(tài))
            byte[] dataBytes = new byte[dataLen];
            socket.Receive(dataBytes, 0, dataLen, SocketFlags.None);
            return new List<byte>(dataBytes);
        }
        #endregion

        #region plc控制
        /// <summary>
        /// PLC遠(yuǎn)程啟動(dòng)
        /// </summary>
        /// <returns></returns>
        public Result Run()
        {
            return PlcStatus(0x01, new List<byte> { 0x00, 0x00 });
        }
        /// <summary>
        /// PLC遠(yuǎn)程停止
        /// </summary>
        /// <returns></returns>
        public Result Stop()
        {
            return PlcStatus(0x02);
        }
        /// <summary>
        /// PLC運(yùn)行狀態(tài)
        /// </summary>
        /// <param name="cmdCode"></param>
        /// <param name="cmd"></param>
        /// <returns></returns>
        private Result PlcStatus(byte cmdCode, List<byte> cmd = null)
        {
            Result result = new Result();
            try
            {
                var connectState = this.Connect();
                if (!connectState.IsSuccessed)
                {
                    throw new Exception(connectState.Message);
                }
                List<byte> commandBytes = new List<byte>
                {
                    0x50,0x00,
                    this._netCode,// 可變,根據(jù)PLC的設(shè)置
                    0xFF,
                    0xFF,0x03,
                    this._stationCode,// 可變
                };
                //0x08,0x00,  // 剩余字節(jié)長(zhǎng)度
                List<byte> cmdBytes = new List<byte> {
                    0x0A,0x00,
                    cmdCode,0x10,
                    0x00,0x00,
                    0x01,0x00,//模式
                };
                if (cmd != null)
                {
                    cmdBytes.AddRange(cmd);
                }

                commandBytes.Add((byte)(commandBytes.Count % 256));
                commandBytes.Add((byte)(commandBytes.Count / 256 % 256));
                commandBytes.AddRange(cmdBytes);

                socket.Send(commandBytes.ToArray());

                byte[] respBytes = new byte[11];
                socket.Receive(respBytes, 0, 11, SocketFlags.None);

                // 狀態(tài)
                if ((respBytes[9] | respBytes[10]) != 0x00)
                {
                    throw new Exception("響應(yīng)異常。" + respBytes[1].ToString());
                }
            }
            catch (Exception ex)
            {
                result.IsSuccessed = false;
                result.Message = ex.Message;
            }
            return result;
        }
        #endregion
    }
}

?4、測(cè)試通訊庫(kù)

1、啟動(dòng)MC服務(wù)器

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC

2、利用通訊庫(kù)讀寫數(shù)據(jù)

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC

1、讀取D區(qū)100開始的3個(gè)short數(shù)據(jù)

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC?

2、讀取M區(qū)100開始的5個(gè)float數(shù)據(jù)

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC?

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC?

3、讀取X區(qū)100開始的4個(gè)bool數(shù)據(jù)

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC?

4、寫入M區(qū)200開始的2個(gè)short數(shù)據(jù)

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC

?C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC

5、寫入D區(qū)200開始的5個(gè)float數(shù)據(jù)

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC?C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC

?

3、完整代碼

 /// <summary>
 /// 測(cè)試A-3E通訊庫(kù)
 /// </summary>
 static void MCLibTestA3E()
 {
     A3E qNA3E = new A3E("192.168.1.7", 6000);
     #region 讀數(shù)據(jù)
     //Console.WriteLine("讀取D區(qū)100開始的3個(gè)short數(shù)據(jù)");
     //var result1 = qNA3E.Read<short>("D100", 3);
     //if (result1.IsSuccessed)
     //{
     //    result1.Datas.ForEach(d => Console.WriteLine(d));
     //}
     //else
     //{
     //    Console.WriteLine(result1.Message);
     //}
     //Console.WriteLine("讀取M區(qū)100開始的5個(gè)float數(shù)據(jù)");
     //var result2 = qNA3E.Read<float>("M100", 5);
     //if (result2.IsSuccessed)
     //{
     //    result2.Datas.ForEach(d => Console.WriteLine(d));
     //}
     //else
     //{
     //    Console.WriteLine(result2.Message);
     //}
     //Console.WriteLine("讀取X區(qū)100開始的4個(gè)bool數(shù)據(jù)");
     //var result3 = qNA3E.Read<bool>(AreaCode.X, "100", 4);
     //if (result3.IsSuccessed)
     //{
     //    result3.Datas.ForEach(d => Console.WriteLine(d));
     //}
     //else
     //{
     //    Console.WriteLine(result3.Message);
     //}

     #endregion

     #region 寫數(shù)據(jù)

     Console.WriteLine("寫入M區(qū)200開始的2個(gè)short數(shù)據(jù)");
     var result4 = qNA3E.Write<short>(new List<short> { -541, 982 }, "M200");
     if (result4.IsSuccessed)
     {
         Console.WriteLine(result4.Message);
     }
     Console.WriteLine("寫入D區(qū)200開始的5個(gè)float數(shù)據(jù)");
     var result5 = qNA3E.Write<float>(new List<float> { 111, 0, -8076, 13.67f, -985.325f }, "D200");
     if (result5.IsSuccessed)
     {
         Console.WriteLine(result5.Message);
     }
     #endregion 
 }

5、小結(jié)

原創(chuàng)真的不容易,走過路過不要錯(cuò)過,點(diǎn)贊關(guān)注收藏又圈粉,共同致富。

原創(chuàng)真的不容易,走過路過不要錯(cuò)過,點(diǎn)贊關(guān)注收藏又圈粉,共同致富。

原創(chuàng)真的不容易,走過路過不要錯(cuò)過,點(diǎn)贊關(guān)注收藏又圈粉,共同致富

C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版),C#上位機(jī)開發(fā)筆記,三菱PLC,三菱MC協(xié)議,三菱A-3E報(bào)文,C#與三菱PLC文章來源地址http://www.zghlxwxcb.cn/news/detail-835546.html

到了這里,關(guān)于C#上位機(jī)與三菱PLC的通信09---開發(fā)自己的通訊庫(kù)(A-3E版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C#上位機(jī)與三菱FX3UPLC實(shí)現(xiàn)異步偽實(shí)時(shí)串口通信機(jī)制(串口類通信可參考)

    C#上位機(jī)與三菱FX3UPLC實(shí)現(xiàn)異步偽實(shí)時(shí)串口通信機(jī)制(串口類通信可參考)

    串口是串行接口(serial port)的簡(jiǎn)稱,也稱為 串行通信接口 或 COM接口。 串口通信(serial communication)是指采用串行通信協(xié)議在一條信號(hào)線上將數(shù)據(jù)一個(gè)比特一個(gè)比特地逐位進(jìn)行傳輸?shù)耐ㄐ拍J健?串口按電氣標(biāo)準(zhǔn)及協(xié)議來劃分,包括RS-232-C、RS-422、RS485等。 在串行通信中,數(shù)

    2023年04月21日
    瀏覽(45)
  • C# 三菱PLC上位機(jī)開發(fā)環(huán)境搭建

    C# 三菱PLC上位機(jī)開發(fā)環(huán)境搭建

    一、安裝軟件 用到兩個(gè)三菱的軟件: 1. MX Component(下載地址?也可以直接在官網(wǎng)上搜索,注意MX后面有空格) 用于連接PLC 2. GX Works2(下載地址?用GX Works3也行) 這個(gè)軟件主要是電氣做PLC編程,我們用來作為仿真,省去開發(fā)時(shí)擺弄真實(shí)PLC 序列號(hào):117-570766844 二、配置軟件 MX

    2023年04月18日
    瀏覽(22)
  • C#學(xué)習(xí)筆記9:winform上位機(jī)與西門子PLC網(wǎng)口通信_(tái)上篇

    C#學(xué)習(xí)筆記9:winform上位機(jī)與西門子PLC網(wǎng)口通信_(tái)上篇

    今日繼續(xù)我的C#學(xué)習(xí)筆記,今日開始學(xué)習(xí)打開使用千兆網(wǎng)口來進(jìn)行與西門子PLC的通信: 文章提供整體代碼、解釋、測(cè)試效果截圖、整體測(cè)試工程下載: 主要包含的知識(shí)有: 下載NuGet程序包、 西門子PLC及通信協(xié)議、搭建虛擬的S7通信仿真環(huán)境、C#與西門子S7的六大通信庫(kù)了解 其

    2024年04月14日
    瀏覽(23)
  • 上位機(jī)與PLC:ModbusTCP通訊之?dāng)?shù)據(jù)類型轉(zhuǎn)換

    上位機(jī)與PLC:ModbusTCP通訊之?dāng)?shù)據(jù)類型轉(zhuǎn)換

    從PLC讀取的數(shù)值,不管是讀正負(fù)整數(shù)還是正負(fù)浮點(diǎn)數(shù),讀取過來后都會(huì)變成UInt16,也就是Ushort類型 前請(qǐng)?zhí)嵋篒nt32是32位,ushort是16位,byte是8位 (1)使用原因 向PLC的地址讀取數(shù)據(jù),PLC向地址寫入32位整數(shù),數(shù)值為100,但Modbus傳輸走的是16位,因此無法直接把數(shù)值展示到頁面上

    2024年02月03日
    瀏覽(37)
  • 上位機(jī)與歐姆龍PLC的Fins tcp通訊

    參考1:(147條消息) 歐姆龍PLC的FinsTCP協(xié)議_weixin_37700863的博客-CSDN博客_歐姆龍fins協(xié)議tcp?? 參考2:(147條消息) FinsTCP協(xié)議報(bào)文詳細(xì)分析_常哥說編程的博客-CSDN博客_fins協(xié)議 參考3:(147條消息) 歐姆龍F(tuán)INS通訊命令實(shí)例詳解_搬磚dog的博客-CSDN博客_歐姆龍fins 上述文檔中有部分描述錯(cuò)誤

    2024年02月11日
    瀏覽(49)
  • C#上位機(jī)與西門子PLC數(shù)據(jù)交互

    C#上位機(jī)與西門子PLC數(shù)據(jù)交互

    拉了換一個(gè)簡(jiǎn)單的界面 我新建了一個(gè)DB數(shù)據(jù)塊【DB1】,右鍵【DB1】,點(diǎn)擊【屬性】項(xiàng),【優(yōu)化的塊訪問】默認(rèn)是勾選,要想顯示數(shù)據(jù)塊中地址偏移量,需要把【優(yōu)化的塊訪問】勾選取消 1、右鍵項(xiàng)目名,選擇圖中【管理NuGet程序包】 2、在搜索框輸入【S7netplus】,我安裝的是第

    2024年02月13日
    瀏覽(28)
  • 【Qt上位機(jī)與STM32進(jìn)行串口通信】-2-Qt串口開發(fā)

    【Qt上位機(jī)與STM32進(jìn)行串口通信】-2-Qt串口開發(fā)

    系列文章目標(biāo):Qt上位機(jī)與STM32進(jìn)行串口通信,控制多個(gè)LED的狀態(tài)。 本篇文章的主要目標(biāo): 1、設(shè)計(jì)兩個(gè)界面,串口連接界面、控制界面。 2、只有在串口連接成功才能打開控制界面。 3、打開控制界面時(shí),串口保持連接。 4、自定義控件,提升開發(fā)效率。 以下是我入門Qt的視頻

    2024年02月06日
    瀏覽(23)
  • 兩臺(tái)三菱PLC通過485通訊控制

    兩臺(tái)三菱PLC通過485通訊控制

    本例硬件配置: 1.兩臺(tái)FX1S小型PLC (主站與從站) 2.一根3芯線做485通訊使用 3.一根422程序下載線(三菱PLC) 硬件接線: 采用1對(duì)接線方式 主站:接線實(shí)物(終端電阻未接入) 從站:接線實(shí)物(終端電阻未接入) 軟件程序設(shè)置: 主站: 從站:與主站參數(shù)設(shè)置一致 程序: 1.主

    2024年02月12日
    瀏覽(22)
  • C#上位機(jī)基礎(chǔ)學(xué)習(xí)_基于SOCKET實(shí)現(xiàn)與PLC服務(wù)器的TCP通信(一)

    C#上位機(jī)基礎(chǔ)學(xué)習(xí)_基于SOCKET實(shí)現(xiàn)與PLC服務(wù)器的TCP通信(一)

    測(cè)試軟件: TIA PORTAL V15.1 S7-PLCSIM ADVANCED V3.0 Visual Studio 2019 如下圖所示,打開S7-PLCSIM ADVANCED V3.0仿真軟件,新鍵一個(gè)實(shí)例,設(shè)置仿真PLC的IP地址等參數(shù),然后點(diǎn)擊Start激活PLC, 如下圖所示,激活PLC后,可以看到已經(jīng)存在一個(gè)實(shí)例, 如下圖所示,打開TIA PORTAL V15.1,新建一個(gè)項(xiàng)目,

    2023年04月15日
    瀏覽(24)
  • Modbus通信從入門到精通_2_Modbus TCP通信詳解及仿真(搭建ModbusTCP仿真環(huán)境:創(chuàng)建虛擬PLC并進(jìn)行ModbusTCP通訊;寄存器與PLC中映射關(guān)系;適合理解如何編寫上位機(jī))

    Modbus通信從入門到精通_2_Modbus TCP通信詳解及仿真(搭建ModbusTCP仿真環(huán)境:創(chuàng)建虛擬PLC并進(jìn)行ModbusTCP通訊;寄存器與PLC中映射關(guān)系;適合理解如何編寫上位機(jī))

    本篇將會(huì)以西門子PLC軟件搭建ModbusTCP仿真環(huán)境,并通過仿真環(huán)境,介紹基礎(chǔ)知識(shí)及模擬實(shí)際應(yīng)用中寫一個(gè)簡(jiǎn)單的通信讀取PLC數(shù)據(jù)方法,并簡(jiǎn)介了編寫上位機(jī)的方法。 由于具有TCP/IP棧協(xié)議,通常在Modbus TCP通訊的上位機(jī)開發(fā)中, 上位機(jī)是作為客戶端,控制器作為服務(wù)器 。Modbu

    2024年02月08日
    瀏覽(918)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包