Files
Modbus.Net/Modbus.Net/ModBus.Net/BaseMachine.cs
parallelbgls@outlook.com 277702b050 2015-07-08 update 1
2015-07-09 10:12:59 +08:00

173 lines
5.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
namespace ModBus.Net
{
public abstract class BaseMachine : IMachineProperty
{
public int Id { get; set; }
public string ProjectName { get; set; }
public string MachineName { get; set; }
public string ConnectionToken
{
get { return BaseUtility.ConnectionToken; }
}
public AddressFormater AddressFormater { get; set; }
public AddressCombiner AddressCombiner { get; set; }
public MachineExtend MachineExtend { get; set; }
protected IEnumerable<CommunicationUnit> CommunicateAddresses
{
get { return AddressCombiner.Combine(GetAddresses); }
}
public IEnumerable<AddressUnit> GetAddresses { get; set; }
public bool KeepConnect { get; set; }
protected BaseUtility BaseUtility { get; set; }
protected BaseMachine(IEnumerable<AddressUnit> getAddresses)
: this(getAddresses, false)
{
}
protected BaseMachine(IEnumerable<AddressUnit> getAddresses, bool keepConnect)
{
GetAddresses = getAddresses;
KeepConnect = keepConnect;
}
public Dictionary<string,ReturnUnit> GetDatas()
{
Dictionary<string, ReturnUnit> ans = new Dictionary<string, ReturnUnit>();
if (!BaseUtility.IsConnected)
{
BaseUtility.Connect();
}
foreach (var communicateAddress in CommunicateAddresses)
{
var datas = BaseUtility.GetDatas<byte>(2, 0, AddressFormater.FormatAddress(communicateAddress.Area,communicateAddress.Address), communicateAddress.GetCount);
int pos = 0;
while (pos < communicateAddress.GetCount)
{
var address =
GetAddresses.SingleOrDefault(
p => p.Area == communicateAddress.Area && p.Address == pos + communicateAddress.Address);
if (address != null)
{
ans.Add(address.CommunicationTag, new ReturnUnit{PlcValue = Math.Round(Single.Parse(ValueHelper.Instance.GetValue(datas, ref pos, address.DataType).ToString()) * address.Zoom, address.DataType == typeof(System.Single) || address.DataType == typeof(System.Double) ? 3 : (Math.Log10(address.Zoom) > 0 ? 0 : (int)Math.Ceiling(-Math.Log10(address.Zoom)))).ToString(),UnitExtend = address.UnitExtend});
}
else
{
pos++;
}
}
}
if (!KeepConnect)
{
BaseUtility.Disconnect();
}
return ans;
}
public bool Connect()
{
return BaseUtility.Connect();
}
public bool Disconnect()
{
return BaseUtility.Disconnect();
}
}
public class BaseMachineEqualityComparer : IEqualityComparer<BaseMachine>
{
public bool Equals(BaseMachine x, BaseMachine y)
{
return x.ConnectionToken == y.ConnectionToken;
}
public int GetHashCode(BaseMachine obj)
{
return obj.GetHashCode();
}
}
public class CommunicationUnit
{
public string Area { get; set; }
public int Address { get; set; }
public int GetCount { get; set; }
public Type DataType { get; set; }
}
public class UnitExtend
{
}
public class MachineExtend
{
}
public class ReturnUnit
{
public string PlcValue { get; set; }
public UnitExtend UnitExtend { get; set; }
}
public class AddressUnit
{
public int Id { get; set; }
/// <summary>
/// 数据所属的区域Modbus指通讯码PROFINET指数据块
/// </summary>
public string Area { get; set; }
public int Address { get; set; }
public Type DataType { get; set; }
/// <summary>
/// 放缩比例
/// </summary>
public double Zoom { get; set; }
/// <summary>
/// 通讯标识名称
/// </summary>
public string CommunicationTag { get; set; }
public string Name { get; set; }
public string Unit { get; set; }
public UnitExtend UnitExtend { get; set; }
}
public struct AddressUnitEqualityComparer : IEqualityComparer<AddressUnit>
{
public bool Equals(AddressUnit x, AddressUnit y)
{
return x.Area.ToUpper() == y.Area.ToUpper() && x.Address == y.Address;
}
public int GetHashCode(AddressUnit obj)
{
return obj.GetHashCode();
}
}
public interface IMachineProperty
{
int Id { get; set; }
string ProjectName { get; set; }
string MachineName { get; set; }
string ConnectionToken { get; }
}
}