usingHslCommunication.Core;usingHslCommunication.Core.IMessage;usingHslCommunication.Core.Net;usingSystem.Collections.Generic;usingSystem.Net.Sockets;usingSystem.Text;namespaceHslCommunication.Profinet.OpenProtocol{///<summary>///开放以太网协议///</summary>publicclassOpenProtocolNet:NetworkDoubleBase<OpenProtocolMessage,RegularByteTransform>{#regionConstructor///<summary>///实例化一个默认的对象///</summary>publicOpenProtocolNet(){}///<summary>///使用指定的IP地址来初始化对象///</summary>///<paramname="ipAddress">Ip地址</param>///<paramname="port">端口号</param>publicOpenProtocolNet(stringipAddress,intport){}#endregion#regionOverrideNetworkDoubleBase///<summary>///连接上服务器后需要进行的初始化操作///</summary>///<paramname="socket">网络套接字</param>///<returns>是否初始化成功,依据具体的协议进行重写</returns>protectedoverrideOperateResultInitializationOnConnect(Socketsocket){//此处的revison应该等于多少?OperateResult<string>open=ReadCustomer(1,0,0,0,null);if(!open.IsSuccess)returnopen;if(open.Content.Substring(4,4)=="0002")returnOperateResult.CreateSuccessResult();elsereturnnewOperateResult("Failed:"+open.Content.Substring(4,4));}#endregion///<summary>///自定义的命令读取///</summary>///<paramname="mid"></param>///<paramname="revison"></param>///<paramname="stationId"></param>///<paramname="spindleId"></param>///<paramname="parameters"></param>///<returns></returns>publicOperateResult<string>ReadCustomer(intmid,intrevison,intstationId,intspindleId,List<string>parameters){if(parameters!=null)parameters=newList<string>();OperateResult<byte[]>command=BuildReadCommand(mid,revison,stationId,spindleId,parameters);if(!command.IsSuccess)returnOperateResult.CreateFailedResult<string>(command);OperateResult<byte[]>read=ReadFromCoreServer(command.Content);if(!read.IsSuccess)returnOperateResult.CreateFailedResult<string>(read);returnOperateResult.CreateSuccessResult(Encoding.ASCII.GetString(read.Content));}#regionObjectOverride///<summary>///返回表示当前对象的字符串///</summary>///<returns>字符串信息</returns>publicoverridestringToString(){return$"OpenProtocolNet[{IpAddress}:{Port}]";}#endregion///<summary>///构建一个读取的初始报文///</summary>///<paramname="mid"></param>///<paramname="revison"></param>///<paramname="stationId"></param>///<paramname="spindleId"></param>///<paramname="parameters"></param>///<returns></returns>publicstaticOperateResult<byte[]>BuildReadCommand(intmid,intrevison,intstationId,intspindleId,List<string>parameters){if(mid<0||mid>9999)returnnewOperateResult<byte[]>("Mid must be between 0 - 9999");if(revison<0||revison>999)returnnewOperateResult<byte[]>("revison must be between 0 - 999");if(stationId<0||stationId>9)returnnewOperateResult<byte[]>("stationId must be between 0 - 9");if(spindleId<0||spindleId>99)returnnewOperateResult<byte[]>("spindleId must be between 0 - 99");intcount=0;if(parameters!=null)parameters.ForEach(m=>count+=m.Length);StringBuildersb=newStringBuilder();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(inti=0;i<parameters.Count;i++){sb.Append(parameters[i]);}sb.Append('\0');returnOperateResult.CreateSuccessResult(Encoding.ASCII.GetBytes(sb.ToString()));}}}