using System; using System.Collections.Generic; using System.Linq; using System.Text; using HslCommunication.Core.Net; using HslCommunication.Core.IMessage; using HslCommunication.Core; using System.Net.Sockets; namespace HslCommunication.Profinet.OpenProtocol { /// /// 开放以太网协议 /// public class OpenProtocolNet : NetworkDoubleBase { #region Constructor /// /// 实例化一个默认的对象 /// public OpenProtocolNet( ) { } /// /// 使用指定的IP地址来初始化对象 /// /// Ip地址 /// 端口号 public OpenProtocolNet( string ipAddress, int port ) { } #endregion #region Override NetworkDoubleBase /// /// 连接上服务器后需要进行的初始化操作 /// /// 网络套接字 /// 是否初始化成功,依据具体的协议进行重写 protected override OperateResult InitializationOnConnect( Socket socket ) { // 此处的 revison 应该等于多少? OperateResult open = ReadCustomer( 1, 0, 0, 0, null ); if (!open.IsSuccess) return open; if (open.Content.Substring( 4, 4 ) == "0002") return OperateResult.CreateSuccessResult( ); else return new OperateResult( "Failed:" + open.Content.Substring( 4, 4 ) ); } #endregion /// /// 自定义的命令读取 /// /// /// /// /// /// /// public OperateResult ReadCustomer( int mid, int revison, int stationId, int spindleId, List parameters ) { if (parameters != null) parameters = new List( ); OperateResult command = BuildReadCommand( mid, revison, stationId, spindleId, parameters ); if (!command.IsSuccess) return OperateResult.CreateFailedResult( command ); OperateResult read = ReadFromCoreServer( command.Content ); if(!read.IsSuccess) return OperateResult.CreateFailedResult( read ); return OperateResult.CreateSuccessResult( Encoding.ASCII.GetString( read.Content ) ); } #region Object Override /// /// 返回表示当前对象的字符串 /// /// 字符串信息 public override string ToString( ) { return $"OpenProtocolNet[{IpAddress}:{Port}]"; } #endregion /// /// 构建一个读取的初始报文 /// /// /// /// /// /// /// public static OperateResult BuildReadCommand( int mid, int revison, int stationId, int spindleId, List parameters ) { if (mid < 0 || mid > 9999) return new OperateResult( "Mid must be between 0 - 9999" ); if (revison < 0 || revison > 999) return new OperateResult( "revison must be between 0 - 999" ); if (stationId < 0 || stationId > 9) return new OperateResult( "stationId must be between 0 - 9" ); if (spindleId < 0 || spindleId > 99) return new OperateResult( "spindleId must be between 0 - 99" ); int count = 0; if (parameters != null) parameters.ForEach( m => count += m.Length ); StringBuilder sb = new StringBuilder( ); sb.Append( (20 + count).ToString( "D4" ) ); sb.Append( mid.ToString( "D4" ) ); sb.Append( revison.ToString( "D3" ) ); sb.Append( '\0' ); sb.Append( stationId.ToString( "D1" ) ); sb.Append( spindleId.ToString( "D2" ) ); sb.Append( '\0' ); sb.Append( '\0' ); sb.Append( '\0' ); sb.Append( '\0' ); sb.Append( '\0' ); if (parameters != null) for (int i = 0; i < parameters.Count; i++) { sb.Append( parameters[i] ); } sb.Append( '\0' ); return OperateResult.CreateSuccessResult( Encoding.ASCII.GetBytes( sb.ToString( ) ) ); } } }