2015-04-09 update 1 because documents is uncorrect. GetTime and SetTime in Simense are all deleted.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.Eventing;
|
||||
using System.Linq;
|
||||
using System.Reflection.Emit;
|
||||
using System.Windows.Forms;
|
||||
@@ -354,138 +355,67 @@ namespace ModBus.Net
|
||||
|
||||
public class ReadTimeSimenseOutputStruct : OutputStruct
|
||||
{
|
||||
public ReadTimeSimenseOutputStruct(ushort pduRef, DateTime dateTime)
|
||||
public ReadTimeSimenseOutputStruct(ushort pduRef, DateTime dateTime, TodClockStatus todClockStatus)
|
||||
{
|
||||
PduRef = pduRef;
|
||||
DateTime = dateTime;
|
||||
TodClockStatus = todClockStatus;
|
||||
}
|
||||
|
||||
public ushort PduRef { get; private set; }
|
||||
public DateTime DateTime { get; private set; }
|
||||
public TodClockStatus TodClockStatus { get; private set; }
|
||||
}
|
||||
|
||||
public class ReadTimeSimenseProtocal : ProtocalUnit
|
||||
{
|
||||
public override byte[] Format(InputStruct message)
|
||||
{
|
||||
var r_message = (ReadTimeSimenseInputStruct) message;
|
||||
const byte protoId = 0x32;
|
||||
const byte rosctr = 0x07;
|
||||
const ushort redId = 0x0000;
|
||||
ushort pduRef = r_message.PduRef;
|
||||
const ushort parLg = 8;
|
||||
const ushort datLg = 4;
|
||||
const byte serviceId = 0x00;
|
||||
const byte noVar = 0x01;
|
||||
const byte varSpc = 0x12;
|
||||
const byte vAddrLg = 0x04;
|
||||
const byte synId = 0x11;
|
||||
const byte classP = 0x47;
|
||||
const byte id1 = 0x01;
|
||||
const byte id2 = 0x00;
|
||||
const byte accRslt = 0x0A;
|
||||
const byte dType = 0x00;
|
||||
const ushort length = 0x0000;
|
||||
return Format(new Byte[7], protoId, rosctr, redId, pduRef, parLg, datLg, serviceId, noVar, varSpc, vAddrLg, synId, classP,
|
||||
id1, id2, accRslt, dType, length);
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override OutputStruct Unformat(byte[] messageBytes, ref int pos)
|
||||
{
|
||||
pos = 4;
|
||||
ushort pduRef = ValueHelper.Instance.GetUShort(messageBytes, ref pos);
|
||||
pos = 28;
|
||||
byte year1 = ValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
byte month1 = ValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
byte day1 = ValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
byte hour1 = ValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
byte minute1 = ValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
byte second1 = ValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
byte second1_10_100 = ValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
byte second1_1000_weekday = ValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
int year = year1/16*10 + year1%16;
|
||||
int month = month1/16*10 + month1%16;
|
||||
int day = day1/16*10 + day1%16;
|
||||
int hour = hour1/16*10 + hour1%16;
|
||||
int minute = minute1/16*10 + minute1%16;
|
||||
int second = second1/16*10 + second1%16;
|
||||
int millisecond = second1_10_100 / 16 * 100 + second1_10_100 % 16 * 10 + second1_1000_weekday / 16;
|
||||
int weekday = second1_1000_weekday%16;
|
||||
DateTime dateTime = new DateTime(DateTime.Now.Year/100*100 + year, month, day, hour, minute, second, millisecond);
|
||||
if (dateTime > DateTime.Now.AddDays(1)) dateTime = dateTime.AddYears(-100);
|
||||
if (weekday == 0) return new ReadTimeSimenseOutputStruct(pduRef, dateTime);
|
||||
while (dateTime.DayOfWeek != (DayOfWeek) (weekday - 1)) dateTime = dateTime.AddYears(-100);
|
||||
return new ReadTimeSimenseOutputStruct(pduRef, dateTime);
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
public class WriteTimeSimenseInputStruct : InputStruct
|
||||
{
|
||||
public WriteTimeSimenseInputStruct(ushort pduRef, DateTime dateTime)
|
||||
public WriteTimeSimenseInputStruct(ushort pduRef, DateTime dateTime, TodClockStatus todClockStatus)
|
||||
{
|
||||
PduRef = pduRef;
|
||||
DateTime = dateTime;
|
||||
TodClockStatus = todClockStatus;
|
||||
}
|
||||
|
||||
public ushort PduRef { get; private set; }
|
||||
public DateTime DateTime { get; private set; }
|
||||
public TodClockStatus TodClockStatus { get; private set; }
|
||||
}
|
||||
|
||||
public class WriteTimeSimenseOutputStruct : OutputStruct
|
||||
{
|
||||
public WriteTimeSimenseOutputStruct(ushort pduRef, byte id2)
|
||||
public WriteTimeSimenseOutputStruct(ushort pduRef, byte errCod)
|
||||
{
|
||||
PduRef = pduRef;
|
||||
Id2 = id2;
|
||||
ErrCod = errCod;
|
||||
}
|
||||
|
||||
public ushort PduRef { get; private set; }
|
||||
|
||||
public byte Id2 { get; private set; }
|
||||
public byte ErrCod { get;private set; }
|
||||
}
|
||||
|
||||
public class WriteTimeSimenseProtocal : ProtocalUnit
|
||||
{
|
||||
public override byte[] Format(InputStruct message)
|
||||
{
|
||||
var r_message = (WriteTimeSimenseInputStruct) message;
|
||||
const byte protoId = 0x32;
|
||||
const byte rosctr = 0x07;
|
||||
const ushort redId = 0x0000;
|
||||
ushort pduRef = r_message.PduRef;
|
||||
const ushort parLg = 0x0008;
|
||||
const ushort datLg = 0x000e;
|
||||
const byte serviceId = 0x00;
|
||||
const byte noVar = 0x01;
|
||||
const byte varSpc = 0x12;
|
||||
const byte vAddrLg = 0x04;
|
||||
const byte synId = 0x11;
|
||||
const byte classP = 0x47;
|
||||
const byte id1 = 0x02;
|
||||
const byte id2 = 0x00;
|
||||
const byte accRslt = 0xFF;
|
||||
const byte dType = 0x09;
|
||||
const ushort length = 0x000A;
|
||||
const ushort todClockStatus = 0x0018;
|
||||
byte year = (byte) (r_message.DateTime.Year%100/10*16 + r_message.DateTime.Year%10);
|
||||
byte month = (byte) (r_message.DateTime.Month/10*16 + r_message.DateTime.Month%10);
|
||||
byte day = (byte) (r_message.DateTime.Day/10*16 + r_message.DateTime.Day%10);
|
||||
byte hour = (byte) (r_message.DateTime.Hour/10*16 + r_message.DateTime.Hour%10);
|
||||
byte minute = (byte) (r_message.DateTime.Minute/10*16 + r_message.DateTime.Minute%10);
|
||||
byte second = (byte) (r_message.DateTime.Second/10*16 + r_message.DateTime.Second%10);
|
||||
byte dayOfWeek = (byte) (r_message.DateTime.DayOfWeek + 1);
|
||||
return Format(new byte[7], protoId, rosctr, redId, pduRef, parLg, datLg, serviceId, noVar, varSpc, vAddrLg,
|
||||
synId, classP, id1, id2, accRslt, dType, length, todClockStatus, year, month, day, hour, minute, second,
|
||||
(byte)0, dayOfWeek);
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override OutputStruct Unformat(byte[] messageBytes, ref int pos)
|
||||
{
|
||||
pos = 4;
|
||||
ushort pduRef = ValueHelper.Instance.GetUShort(messageBytes, ref pos);
|
||||
pos = 17;
|
||||
byte id2 = ValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
return new WriteTimeSimenseOutputStruct(pduRef, id2);
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,20 +13,23 @@ namespace ModBus.Net
|
||||
private ushort _maxCalling;
|
||||
private ushort _maxCalled;
|
||||
private ushort _maxPdu;
|
||||
private byte _tdpuSize;
|
||||
|
||||
private string _ip;
|
||||
private int connectTryCount;
|
||||
|
||||
public SimenseTcpProtocal(ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, ushort maxPdu) : this(tsapSrc, tsapDst, maxCalling, maxCalled, maxPdu, ConfigurationManager.IP)
|
||||
public SimenseTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, ushort maxPdu) : this(tdpuSize, tsapSrc, tsapDst, maxCalling, maxCalled, maxPdu, ConfigurationManager.IP)
|
||||
{
|
||||
}
|
||||
|
||||
public SimenseTcpProtocal(ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, ushort maxPdu, string ip)
|
||||
public SimenseTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, ushort maxPdu, string ip)
|
||||
{
|
||||
_taspSrc = tsapSrc;
|
||||
_tsapDst = tsapDst;
|
||||
_maxCalling = maxCalling;
|
||||
_maxCalled = maxCalled;
|
||||
_maxPdu = maxPdu;
|
||||
_tdpuSize = tdpuSize;
|
||||
_ip = ip;
|
||||
connectTryCount = 0;
|
||||
Connected();
|
||||
@@ -60,7 +63,7 @@ namespace ModBus.Net
|
||||
{
|
||||
connectTryCount++;
|
||||
ProtocalLinker = new SimenseTcpProtocalLinker(_ip);
|
||||
var inputStruct = new CreateReferenceSimenseInputStruct(0x1a, _taspSrc, _tsapDst);
|
||||
var inputStruct = new CreateReferenceSimenseInputStruct(_tdpuSize, _taspSrc, _tsapDst);
|
||||
var outputStruct =
|
||||
(CreateReferenceSimenseOutputStruct)ForceSendReceive(this[typeof(CreateReferenceSimenseProtocal)], inputStruct);
|
||||
if (!ProtocalLinker.IsConnected) return;
|
||||
|
||||
@@ -27,21 +27,23 @@ namespace ModBus.Net
|
||||
{
|
||||
case "200":
|
||||
{
|
||||
_tdpuSize = 0x09;
|
||||
_taspSrc = 0x4d57;
|
||||
_tsapDst = 0x4d57;
|
||||
_maxCalling = 0x0001;
|
||||
_maxCalled = 0x0001;
|
||||
_maxPdu = 0x03c0;
|
||||
_maxPdu = 0x03c0;
|
||||
break;
|
||||
}
|
||||
case "300":
|
||||
case "400":
|
||||
{
|
||||
_tdpuSize = 0x1a;
|
||||
_taspSrc = 0x4b54;
|
||||
_tsapDst = 0x0302;
|
||||
_maxCalling = 0x0001;
|
||||
_maxCalled = 0x0001;
|
||||
_maxPdu = 0x00f0;
|
||||
_maxPdu = 0x00f0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -49,12 +51,13 @@ namespace ModBus.Net
|
||||
}
|
||||
}
|
||||
|
||||
private byte _tdpuSize;
|
||||
private ushort _taspSrc;
|
||||
private ushort _tsapDst;
|
||||
private ushort _maxCalling;
|
||||
private ushort _maxCalled;
|
||||
private ushort _maxPdu;
|
||||
|
||||
|
||||
private SimenseType _simenseType;
|
||||
|
||||
public SimenseType ConnectionType
|
||||
@@ -78,7 +81,7 @@ namespace ModBus.Net
|
||||
}
|
||||
case SimenseType.Tcp:
|
||||
{
|
||||
Wrapper = ConnectionString == null ? new SimenseTcpProtocal(_taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu) : new SimenseTcpProtocal(_taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu, ConnectionString);
|
||||
Wrapper = ConnectionString == null ? new SimenseTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu) : new SimenseTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu, ConnectionString);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace ModBus.Net
|
||||
{
|
||||
_host = ipaddress;
|
||||
_port = port;
|
||||
//TimeoutTime = timeoutTime;
|
||||
TimeoutTime = timeoutTime;
|
||||
}
|
||||
|
||||
public override bool IsConnected
|
||||
|
||||
@@ -25,14 +25,14 @@ namespace ModBus.Net
|
||||
{"System.Double", 8}
|
||||
};
|
||||
|
||||
protected static bool _littleEndian = true;
|
||||
protected static bool _littleEndian = false;
|
||||
|
||||
protected ValueHelper()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 协议中的内容构造是否小端的,默认是大端构造协议。
|
||||
/// 协议中的内容构造是否小端的,默认是小端构造协议。
|
||||
/// </summary>
|
||||
public static bool LittleEndian
|
||||
{
|
||||
@@ -40,8 +40,7 @@ namespace ModBus.Net
|
||||
set
|
||||
{
|
||||
_littleEndian = value;
|
||||
//这里需要重点说明,因为.net默认是小端构造法,所以目标协议是大端的话反而需要调用小端构造协议,把小端反转为大端。
|
||||
_Instance = LittleEndian ? new LittleEndianValueHelper() : new ValueHelper();
|
||||
_Instance = LittleEndian ? new ValueHelper() : new BigEndianValueHelper();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,7 +57,7 @@ namespace ModBus.Net
|
||||
{
|
||||
if (_Instance == null)
|
||||
{
|
||||
_Instance = LittleEndian ? new LittleEndianValueHelper() : new ValueHelper();
|
||||
_Instance = LittleEndian ? new ValueHelper() : new BigEndianValueHelper();
|
||||
}
|
||||
return _Instance;
|
||||
}
|
||||
@@ -566,6 +565,12 @@ namespace ModBus.Net
|
||||
return ans > 0;
|
||||
}
|
||||
|
||||
public virtual bool GetBit(byte[] number, ref int pos)
|
||||
{
|
||||
var tpos = pos%8;
|
||||
return GetBit(number[pos++/8], ref tpos);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置对应数字中相应位置的bit的值
|
||||
/// </summary>
|
||||
@@ -595,9 +600,16 @@ namespace ModBus.Net
|
||||
return (byte) (number & creation);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual ushort SetBit(byte[] number, int pos, bool setBit)
|
||||
{
|
||||
SetBit(number[pos / 8], pos % 8, setBit);
|
||||
var tpos = 0;
|
||||
return GetUShort(number, ref tpos);
|
||||
}
|
||||
}
|
||||
|
||||
internal class LittleEndianValueHelper : ValueHelper
|
||||
internal class BigEndianValueHelper : ValueHelper
|
||||
{
|
||||
public override Byte[] GetBytes(short value)
|
||||
{
|
||||
@@ -703,6 +715,12 @@ namespace ModBus.Net
|
||||
return t;
|
||||
}
|
||||
|
||||
public override bool GetBit(byte[] number, ref int pos)
|
||||
{
|
||||
var tpos = pos % 8;
|
||||
return base.GetBit(number[number.Length - 1 - (pos++ / 8)], ref tpos);
|
||||
}
|
||||
|
||||
public override bool[] GetBits(byte[] data, ref int pos)
|
||||
{
|
||||
bool[] t = new bool[8];
|
||||
@@ -716,6 +734,12 @@ namespace ModBus.Net
|
||||
return t;
|
||||
}
|
||||
|
||||
public override ushort SetBit(byte[] number, int pos, bool setBit)
|
||||
{
|
||||
Array.Reverse(number);
|
||||
return base.SetBit(number, pos, setBit);
|
||||
}
|
||||
|
||||
private Byte[] Reverse(Byte[] data)
|
||||
{
|
||||
Array.Reverse(data);
|
||||
|
||||
Reference in New Issue
Block a user