2015-04-09 update 1 because documents is uncorrect. GetTime and SetTime in Simense are all deleted.

This commit is contained in:
parallelbgls@outlook.com
2015-04-09 16:01:30 +08:00
parent 312d9ab027
commit 884227e15e
5 changed files with 58 additions and 98 deletions

View File

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

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -45,7 +45,7 @@ namespace ModBus.Net
{
_host = ipaddress;
_port = port;
//TimeoutTime = timeoutTime;
TimeoutTime = timeoutTime;
}
public override bool IsConnected

View File

@@ -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);