当前位置: 首页 > article >正文

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

接上一篇,我们连接PLC并握手成功,并且封装生成读写PLC的命令

C#使用TCP-S7协议读写西门子PLC(三)-CSDN博客

这里我们进行读写基础数据类型、读取DB块的字符串、宽字符串、以及一系列连续数组。

新建部分类文件SiemensS7ProtocolUtil.Integrated.cs

主要方法

读取任意连续字节数据, 任意多个Byte读取--每次最多读取200个字节,如果超过200,自动分多次读取

public OperateResult<byte[]> ReadSerialData(PlcRegisterCategory plcRegisterCategory, ushort offsetAddress, ushort dbNumber, int readByteCount) 

写入任意连续的字节数组,每次写入400个字节,如果多于400个,分多次写入

public OperateResult WriteSerialData(PlcRegisterCategory plcRegisterCategory, ushort offsetAddress, ushort dbNumber, byte[] data)

读取一种基础数据类型

public OperateResult<T> ReadData<T>(PlcRegisterCategory plcRegisterCategory, ushort offsetAddress, ushort dbNumber) 

写入一种基础数据类型

public OperateResult WriteData<T>(PlcRegisterCategory plcRegisterCategory, ushort offsetAddress, ushort dbNumber, T data)

读取连续Real【Float】数组

public OperateResult<float[]> ReadSerialRealArray(PlcRegisterCategory plcRegisterCategory, ushort offsetAddress, ushort dbNumber, int realDataCount) 

写连续Real数组

public OperateResult WriteSerialRealArray(PlcRegisterCategory plcRegisterCategory, ushort offsetAddress, ushort dbNumber, float[] realArray) 

写入字符串

public OperateResult DB_WriteString(ushort dbNumber, ushort offsetAddress, int maxLength, string writeString)

读取字符串

public OperateResult<string> DB_ReadString(ushort dbNumber, ushort offsetAddress, byte maxLength)

部分类SiemensS7ProtocolUtil.Integrated.cs相关源程序如下

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

namespace PlcSiemesS7Demo
{
    /// <summary>
    /// 综合读写S7协议操作,
    /// 所有读操作都统一使用方法:ReadSerialData(PlcRegisterCategory plcRegisterCategory, ushort offsetAddress, ushort dbNumber, int readByteCount) 
    /// 所有写操作都统一使用方法:WriteSerialData(PlcRegisterCategory plcRegisterCategory, ushort offsetAddress, ushort dbNumber, byte[] data)
    /// </summary>
    public partial class SiemensS7ProtocolUtil
    {
        /// <summary>
        /// 读取任意连续字节数据,因西门子PLC的每个DB块的最大偏移量是65535,因此最多读取65536个字节数据
        /// 任意多个Byte读取--每次最多读取200个字节,如果超过200,自动分多次读取
        /// </summary>
        /// <param name="plcRegisterCategory"></param>
        /// <param name="offsetAddress"></param>
        /// <param name="dbNumber"></param>
        /// <param name="readByteCount"></param>
        /// <returns></returns>
        public OperateResult<byte[]> ReadSerialData(PlcRegisterCategory plcRegisterCategory, ushort offsetAddress, ushort dbNumber, int readByteCount) 
        {
            byte[] destArray = new byte[readByteCount];
            int pageSize = (readByteCount + 199) / 200;
            for (int i = 0; i < pageSize; i++)
            {
                int byteCount = 200;//每次读取200个字节
                if (i + 1 == pageSize) //最后一次读取剩余字节
                {
                    byteCount = readByteCount - 200 * i;
                }
                OperateResult<byte, int, ushort> resultAddress = AnalysisAddress(plcRegisterCategory, offsetAddress, dbNumber);
                OperateResult<byte[]> operateResult = Read(new OperateResult<byte, int, ushort>[] { resultAddress }, new ushort[] { (ushort)byteCount });
                if (!operateResult.IsSuccess) 
                {
                    return operateResult;
                }
                Array.Copy(operateResult.Content, 0, destArray, 200 * i, byteCount);
                offsetAddress += 200;
            }
            return OperateResult.CreateSuccessResult(destArray);
        }

        /// <summary>
        /// 写入任意连续的字节数组,每次写入400个字节,如果多于400个,分多次写入
        /// 因西门子PLC的每个DB块的最大偏移量是65535,因此最多写入65536个字节数据
        /// </summary>
        /// <param name="plcRegisterCategory"></param>
        /// <param name="offsetAddress"></param>
        /// <param name="dbNumber"

http://www.kler.cn/news/309249.html

相关文章:

  • Qt常用控件——QDateTimeEdit
  • 【华为OD】2024D卷——生成哈夫曼树
  • CAD图纸加密软件哪个好?10款2024主流CAD图纸加密软件分享!
  • 如何利用Samba跨平台分享Ubuntu文件夹
  • 电路设计学习(一)
  • 【Day14-单例设计模式动态代理】
  • 一文吃透JVM面试八股文
  • 每日学习一个数据结构-DFA确定有限状态机
  • 【linux】VisiData:强大的命令行数据处理工具
  • 跟李沐学AI:序列到序列seq2seq
  • 本地部署大模型并使用知识库Windows下Ollama+Docker+MaxKB安装的记录
  • 影刀RPE学习——自动化
  • 地大信息-基础信息平台 GetImg 任意文件读取漏洞复现
  • http和https分别是什么?区别是什么?
  • GO GIN SSE DEMO
  • Springboot项目打war包运行及错误解决
  • SpringCloud Alibaba入门简介
  • 最优化理论与自动驾驶(一):概述
  • 你认为嵌入式软件开发的尽头是什么?
  • 了解 React 应用程序中的渲染和重新渲染:它们如何工作以及如何优化它们
  • NEXT.js 中间件 NextResponse.redirect 无效
  • 2576. 求出最多标记下标(24.9.12)
  • 【C/C++】涉及string类的经典OJ编程题
  • Mina protocol - 体验教程
  • 【每日一题】LeetCode 1184.公交站间的距离问题(数组)
  • 【大模型技术教程】FastGPT一站式解决方案[1-部署篇]:轻松实现RAG-智能问答系统
  • C语言习题~day32
  • 密码学---easy_hash
  • 论文阅读: SigLit | SigLip |Sigmoid Loss for Language Image Pre-Training
  • 【Kubernetes】常见面试题汇总(二十一)