You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
4.9 KiB
C#

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
{
/// <summary>
/// 开放以太网协议
/// </summary>
public class OpenProtocolNet : NetworkDoubleBase<OpenProtocolMessage, RegularByteTransform>
{
#region Constructor
/// <summary>
/// 实例化一个默认的对象
/// </summary>
public OpenProtocolNet( )
{
}
/// <summary>
/// 使用指定的IP地址来初始化对象
/// </summary>
/// <param name="ipAddress">Ip地址</param>
/// <param name="port">端口号</param>
public OpenProtocolNet( string ipAddress, int port )
{
}
#endregion
#region Override NetworkDoubleBase
/// <summary>
/// 连接上服务器后需要进行的初始化操作
/// </summary>
/// <param name="socket">网络套接字</param>
/// <returns>是否初始化成功,依据具体的协议进行重写</returns>
protected override OperateResult InitializationOnConnect( Socket socket )
{
// 此处的 revison 应该等于多少?
OperateResult<string> 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
/// <summary>
/// 自定义的命令读取
/// </summary>
/// <param name="mid"></param>
/// <param name="revison"></param>
/// <param name="stationId"></param>
/// <param name="spindleId"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public OperateResult<string> ReadCustomer( int mid, int revison, int stationId, int spindleId, List<string> parameters )
{
if (parameters != null) parameters = new List<string>( );
OperateResult<byte[]> command = BuildReadCommand( mid, revison, stationId, spindleId, parameters );
if (!command.IsSuccess) return OperateResult.CreateFailedResult<string>( command );
OperateResult<byte[]> read = ReadFromCoreServer( command.Content );
if(!read.IsSuccess) return OperateResult.CreateFailedResult<string>( read );
return OperateResult.CreateSuccessResult( Encoding.ASCII.GetString( read.Content ) );
}
#region Object Override
/// <summary>
/// 返回表示当前对象的字符串
/// </summary>
/// <returns>字符串信息</returns>
public override string ToString( )
{
return $"OpenProtocolNet[{IpAddress}:{Port}]";
}
#endregion
/// <summary>
/// 构建一个读取的初始报文
/// </summary>
/// <param name="mid"></param>
/// <param name="revison"></param>
/// <param name="stationId"></param>
/// <param name="spindleId"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public static OperateResult<byte[]> BuildReadCommand( int mid, int revison, int stationId, int spindleId, List<string> parameters )
{
if (mid < 0 || mid > 9999) return new OperateResult<byte[]>( "Mid must be between 0 - 9999" );
if (revison < 0 || revison > 999) return new OperateResult<byte[]>( "revison must be between 0 - 999" );
if (stationId < 0 || stationId > 9) return new OperateResult<byte[]>( "stationId must be between 0 - 9" );
if (spindleId < 0 || spindleId > 99) return new OperateResult<byte[]>( "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( ) ) );
}
}
}