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( ) ) );
}
}
}