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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

斯内科

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

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

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

打赏作者

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

抵扣说明:

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

余额充值