C#使用TCP-S7协议读写西门子PLC(一)

发布于:2024-09-18 ⋅ 阅读:(12) ⋅ 点赞:(0)

之前本人发布西门子S7协议的报文

西门子PLC的S7协议报文解析说明_西门子报文详解-CSDN博客

西门子PLC的S7协议是西门子公司在ModbusTcp协议的基础上自定义的一种协议,仅支持西门子PLC,S7协议本质仍然属于TCP协议的一种自定义具体实现

第一步,准备工作。VS2022中新建窗体应用程序PlcSiemesS7Demo

选择.NETFramework版本为4.7.2

将默认的Form1重命名为FormS7Protocol。

FormS7Protocol窗体设计如下:

第二步,基本辅助相关类OperateResult,用于记录方法的操作结果和相关数据

类OperateResult源程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PlcSiemesS7Demo
{
    /*******************************************************************************
     * 
     *    用户返回多个结果数据的一个类,允许返回操作结果,文本信息,错误代号,等等   
     * 
     *******************************************************************************/

    /// <summary>
    /// 操作结果的类,只带有成功标志和错误信息 -> The class that operates the result, with only success flags and error messages
    /// </summary>
    public class OperateResult
    {
        #region Constructor

        /// <summary>
        /// 实例化一个默认的结果对象
        /// </summary>
        public OperateResult()
        {
        }

        /// <summary>
        /// 使用指定的消息实例化一个默认的结果对象
        /// </summary>
        /// <param name="msg">错误消息</param>
        public OperateResult( string msg )
        {
            this.Message = msg;
        }

        /// <summary>
        /// 使用错误代码,消息文本来实例化对象
        /// </summary>
        /// <param name="err">错误代码</param>
        /// <param name="msg">错误消息</param>
        public OperateResult( int err, string msg )
        {
            this.ErrorCode = err;
            this.Message = msg;
        }

        #endregion
        
        /// <summary>
        /// 指示本次访问是否成功
        /// </summary>
        public bool IsSuccess { get; set; }
        
        /// <summary>
        /// 具体的错误描述
        /// </summary>
        public string Message { get; set; } = "未知错误";
        
        /// <summary>
        /// 具体的错误代码
        /// </summary>
        public int ErrorCode { get; set; } = 10000;
        
        /// <summary>
        /// 获取错误代号及文本描述
        /// </summary>
        /// <returns>包含错误码及错误消息</returns>
        public string ToMessageShowString()
        {
            return $"{"错误代号"}:{ErrorCode}{Environment.NewLine}{"文本描述"}:{Message}";
        }

        /// <summary>
        /// 从另一个结果类中拷贝错误信息
        /// </summary>
        /// <typeparam name="TResult">支持结果类及派生类</typeparam>
        /// <param name="result">结果类及派生类的对象</param>
        public void CopyErrorFromOther<TResult>(TResult result) where TResult : OperateResult
        {
            if (result != null)
            {
                ErrorCode = result.ErrorCode;
                Message = result.Message;
            }            
        }

        #region Static Method

        /*****************************************************************************************************
         * 
         *    主要是方便获取到一些特殊状态的结果对象
         * 
         ******************************************************************************************************/