肖洋
2025-01-11 87cc1c0d71fe6c6000ac6523bbb367d5ac29b5d2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 命名空间:WIDESEAWCS_Communicator
 * 创建者:胡童庆
 * 创建时间:2024/8/2 16:13:36
 * 版本:V1.0.0
 * 描述:基础通讯抽象类,封装连接、断开连接、读取、写入等方法
 *
 * ----------------------------------------------------------------
 * 修改人:
 * 修改时间:
 * 版本:V1.0.1
 * 修改说明:
 * 
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
 
using HslCommunication;
using HslCommunication.LogNet;
using System.Diagnostics.CodeAnalysis;
 
namespace WIDESEAWCS_Communicator
{
    public abstract class BaseCommunicator: IDisposable
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        protected BaseCommunicator()
        {
        }
 
        /// <summary>
        /// 日志记录实例对象
        /// </summary>
        public abstract ILogNet LogNet { get; }
 
        /// <summary>
        /// 设备名称
        /// </summary>
        public abstract string Name { get; }
 
        /// <summary>  
        /// 获取当前通讯器是否已连接到PLC。  
        /// </summary>
        public abstract bool IsConnected { get; }
 
        /// <summary>  
        /// 连接到PLC。
        /// </summary>  
        /// <returns>如果连接成功则返回true,否则返回false。</returns>  
        public abstract bool Connect();
 
        /// <summary>  
        /// 断开与工业设备的连接。  
        /// </summary>  
        /// <returns>如果成功断开连接则返回true,如果已经是断开状态则返回false。</returns>  
        public abstract bool Disconnect();
 
        /// <summary>  
        /// 从PLC读取数据。  
        /// </summary>  
        /// <param name="address">源地址,具体格式取决于使用的工业协议。</param>  
        /// <param name="length">要读取的数据长度。</param>  
        /// <returns>读取到的数据,如果读取失败则可能返回null或空数组。</returns>  
        public abstract byte[] Read(string address, int length);
 
        /// <summary>
        /// 从PLC读取数据。
        /// </summary>
        /// <typeparam name="T">读取数据的类型泛型。</typeparam>
        /// <param name="address">源地址,具体格式取决于使用的工业协议。</param>
        /// <returns>读取到的数据,如果读取失败则可能返回null或抛出异常。</returns>
        public abstract T Read<T>(string address);
 
        /// <summary>
        /// 从PLC读取数据。
        /// </summary>
        /// <param name="address">源地址,具体格式取决于使用的工业协议。</param>
        /// <param name="dataType">数据类型。</param>
        /// <returns>读取到的数据,如果读取失败则可能返回null或抛出异常。</returns>
        public abstract object ReadAsObj(string address, string dataType);
 
        /// <summary>  
        /// 向PLC写入数据。  
        /// </summary>  
        /// <param name="address">源地址,具体格式取决于使用的工业协议。</param>  
        /// <param name="data">要写入的数据。</param>  
        /// <returns>如果写入成功则返回true,否则抛出异常。</returns>  
        public abstract bool Write(string address, byte[] data);
 
        /// <summary>
        /// 向PLC写入数据。  
        /// </summary>
        /// <typeparam name="T">读取数据的类型泛型。</typeparam>
        /// <param name="address">源地址,具体格式取决于使用的工业协议。</param>
        /// <param name="value">要写入的数据。</param>
        /// <returns>如果写入成功则返回true,否则抛出异常。</returns>
        public abstract bool Write<T>(string address, T value) where T : notnull;
 
        /// <summary>
        /// 向PLC写入数据。
        /// </summary>
        /// <param name="address">源地址,具体格式取决于使用的工业协议。</param>
        /// <param name="dataType">要写入的数据类型。</param>
        /// <param name="value">要写入的数据。</param>
        /// <returns>如果写入成功则返回true,失败则抛出异常。</returns>
        /// <exception cref="CommunicationException"></exception>
        public abstract bool WriteObj(string address, string dataType, object value);
 
        /// <summary>
        /// 等待指定地址的泛型类型值为指定的值
        /// </summary>
        /// <typeparam name="T">指定的值的类型泛型。</typeparam>
        /// <param name="address">源地址,具体格式取决于使用的工业协议。</param>
        /// <param name="readInterval">读取的频率。</param>
        /// <param name="waitTimeout">等待的超时时间,如果超时时间为-1的话,则是无期限等待。</param>
        /// <param name="value">等待检测的值</param>
        /// <returns>是否等待成功的结果对象,一旦通信失败,或是等待超时就返回失败。否则返回成功,并告知调用方等待了多久。</returns>
        public abstract OperateResult<TimeSpan> Wait<T>(string address, int readInterval, int waitTimeout, T value) where T : struct;
 
        /// <summary>
        /// 读取自定义的数据类型,需要继承自IDataTransfer接口,返回一个新的类型的实例对象。
        /// </summary>
        /// <typeparam name="T">自定义的数据类型泛型。</typeparam>
        /// <param name="address">源地址,具体格式取决于使用的工业协议。</param>
        /// <returns>成功返回自定义类型数据,失败抛出异常。</returns>
        public abstract T ReadCustomer<T>(string address) where T : IDataTransfer, new();
 
        /// <summary>
        /// 写入自定义类型的数据,该类型必须继承自IDataTransfer接口。
        /// </summary>
        /// <typeparam name="T">自定义的数据类型泛型。</typeparam>
        /// <param name="address">源地址,具体格式取决于使用的工业协议。</param>
        /// <param name="value">要写入数据。</param>
        /// <returns>如果写入成功则返回true,失败则抛出异常。</returns>
        public abstract bool WriteCustomer<T>(string address, [NotNull] T value) where T : IDataTransfer, new();
 
        /// <summary>
        /// 释放对象资源的接口。
        /// </summary>
        public abstract void Dispose();
    }
}