之前本人发布西门子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
/*****************************************************************************************************
*
* 主要是方便获取到一些特殊状态的结果对象
*
******************************************************************************************************/