using System;
using System.Runtime.InteropServices;
namespace Client104Side
{
public class ICE104EndPointController
{
public ICE104EndPointController()
{
string[] test = new string[20];
}
///
/// 结构体转IntPtr
///
///
///
///
public static IntPtr StructToIntPtr(T info)
{
int size = Marshal.SizeOf(info);
IntPtr intPtr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(info, intPtr, true);
return intPtr;
}
///
/// IntPtrz转结构体
///
///
///
///
public static T IntPtrToStruct(IntPtr info)
{
return (T)Marshal.PtrToStructure(info, typeof(T));
}
private const string DLLPath = @".\Client104Side\Dlls\iec104cln_dll.dll";
//public const string DLLPath = @"..\..\..\DataAnalysis\Dlls\iec104cln_dll.dll";
///
/// 启动104客户端
///
///
///
///
/// 返回值 0:启动成功;返回值<0: 启动失败。若启动失败,检查下各配置文件是否完备,各配置文件是否按照要求进行了配置。
[DllImport(DLLPath, EntryPoint = "iec104cln_start", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104clnStart(CLN104_PARAM cln104_param, ICE104CommunicationCallback.CALLBACK_DEV_ON callback_dev_on, ICE104CommunicationCallback.CALLBACK_DEV_OFF callback_dev_off);
///
/// 获取装置的TCP连接状态,该状态写入参数commState中
///
/// 装置地址
/// 保存连接状态
/// 返回值 0:获取状态成功,此时commState指示的状态有效,commState大于等于3 表示已经建立TCP连接;返回值 -1:获取状态失败,此时commState指示的状态无效。可能是该装置地址没有在Config.ini中配置
[DllImport(DLLPath, EntryPoint = "iec104cln_get_device_comm_state", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104GetDeviceCommState(byte devAddr, ref byte commState);
///
/// *获取装置的协议连接状态
///
/// 装置地址
/// 返回值 0:装置在线,此时可以下发总召唤、遥控等命令;返回值 -1:装置不在线。装置(104从站)还未与104主站连接上
[DllImport(DLLPath, EntryPoint = "iec104cln_get_dev_status", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104GetDevStatus(byte addr);
///
/// *获取装置的总召状态
///
/// 装置地址
/// 返回值 0:装置已经总召唤完成,可以读取遥信遥测;返回值 -1:传入的装置地址错误,或装置还未完成总召唤,遥信遥测不可用
[DllImport(DLLPath, EntryPoint = "iec104cln_get_dev_callstatus", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnGetDevCallStatus(byte addr);
///
/// 关闭104客户端
///
/// 返回值 0:关闭成功;返回值<0: 关闭失败
[DllImport(DLLPath, EntryPoint = "iec104cln_end", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnEnd();
///
/// 获取遥测值
///
/// 装置地址
/// 装置扇区
/// 装置信息序号
/// 存储获取的遥测值
/// 返回值 0:获取成功,此时yc_val保存的值有效;返回值 -1:获取失败,此时yc_val保存的值无效。可能是点表中没有与(地址、扇区、inf) 这个三元素 匹配的条目
[DllImport(DLLPath, EntryPoint = "iec104cln_get_yc", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnGetYC(byte dev_addr, byte dev_sector, ushort dev_inf, ref float yc_val);
///
/// 获取遥信值
///
/// 装置地址
/// 装置扇区
/// 装置信息序号
/// 存储获取的遥信值,遥信为双点遥信。遥信为0x83表示该遥信,装置未上送
/// 返回值 0:获取成功,此时yx_val保存的值有效; 返回值 -1:获取失败,此时yx_val保存的值无效。可能是点表中没有与(地址、扇区、inf) 这个三元素 匹配的条目
[DllImport(DLLPath, EntryPoint = "iec104cln_get_yx", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnGetYX(byte dev_addr, byte dev_sector, ushort dev_inf, ref byte yx_val);
///
/// 获取电度值
///
/// 装置地址
/// 装置扇区
/// 装置信息序号
/// 存储获取的电度值
/// 返回值 0:获取成功,此时dd_val保存的值有效;返回值 -1:获取失败,此时dd_val保存的值无效。可能是点表中没有与(地址、扇区、inf) 这个三元素 匹配的条目
[DllImport(DLLPath, EntryPoint = "iec104cln_get_dd", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnGetDD(byte dev_addr, byte dev_sector, ushort dev_inf, IntPtr dd_val);
///
/// 下发遥控命令
///
/// 装置地址
/// 装置扇区
/// 装置信息序号
/// 2 控合,1控分
/// 返回值 0:下发遥控命令成功;返回值 -1:下发遥控命令失败。可能是装置(104从站)还未与104主站连接上,或者该装置地址没有在Config.ini中配置
[DllImport(DLLPath, EntryPoint = "iec104cln_yk", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnYK(byte dev_addr, byte dev_sector, ushort dev_inf, byte yk_dco);
///
/// 总召唤 0 通信状态总召唤 1 遥信遥测总召唤 2 电度总召唤
///
/// 总召唤类型,获取遥信遥测请使用IEC104_YX_CALL
/// 装置地址
/// 返回值 0:下发总召唤命令成功;返回值 -1:下发总召唤命令失败。可能是装置(104从站)还未与104主站连接上,或者该装置地址没有在Config.ini中配置
[DllImport(DLLPath, EntryPoint = "iec104cln_call", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnCall(byte call_type, byte dev_addr);
///
/// 读取遥信变位缓冲区
///
/// 读取到的遥信变位存储在这个参数中
/// 返回值:0成功读取,-1未读取(读取失败是因为缓冲区已读完)
[DllImport(DLLPath, EntryPoint = "iec104cln_read_yx_burst_record", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnReadYXBurstRecord(IntPtr yx_burst);
///
/// 获取数据(遥测、遥信、电度)缓冲区,每次调用自动偏移读取指针
///
/// 遥测缓冲区数据
/// 返回值:0成功获取数据,-1数据未变化,-2到达缓冲区末尾
[DllImport(DLLPath, EntryPoint = "iec104cln_get_yc_buf", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnGetYCBuf(IntPtr yc_burst);
///
/// 获取数据(遥测、遥信、电度)缓冲区,每次调用自动偏移读取指针
///
/// 遥信缓冲区数据
/// 返回值:0成功获取数据,-1数据未变化,-2到达缓冲区末尾
[DllImport(DLLPath, EntryPoint = "iec104cln_get_yx_buf", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnGetYXBuf(IntPtr yx_burst);
///
/// 获取数据(遥测、遥信、电度)缓冲区,每次调用自动偏移读取指针
///
/// 电度缓冲区数据
/// 返回值:0成功获取数据,-1数据未变化,-2到达缓冲区末尾
[DllImport(DLLPath, EntryPoint = "iec104cln_get_dd_buf", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnGetDDBuf(IntPtr dd_burst);
}
///
/// cbt add 2020.3.11 104主站动态库 电度
///
[StructLayout(LayoutKind.Sequential)]
public struct DD_TYPE
{
public byte addr;
public byte sector;
public ushort inf;
public uint val;
public uint chgFlag;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public byte[] tm;
}
///
/// cbt add 2020.4.2 增加遥信、遥测、电度的自定义结构体
///
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct YC_TYPE
{
public byte addr;//装置地址
public byte sector;//装置扇区
public ushort inf;//信息序号(编码地址)
public float val;//遥测值
public uint chgFlag;//值变化的标志(0未变化,1变化)
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public byte[] tm;
}
;
///
/// cbt add 2020.3.11 104主站动态库 遥信
///
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct YX_TYPE
{
public byte addr;
public byte sector;
public ushort inf;
public byte val;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] resv;//预留,字节对齐,无实际作用
public uint chgFlag;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public byte[] tm;
}
;
///
/// cbt add 2020.3.11 104主站动态库 增加变位遥信循环缓冲区
///
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct RECORDYXBURST
{
public byte dev_addr;
public byte dev_sector;
public uint dev_inf;
public byte yx_val;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public byte[] tm;
}
///
/// cbt add 2020.3.11 104动态库启动不读配置文件,所有配置从参数传入
///
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CLN104_PARAM
{
//public byte dev_num;//装置数量
//以下为每个装置的配置
public byte dev_type;//1我司装置、0标准104协议装置
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] dev_ip;//装置ip
public ushort dev_port;//装置的端口号
public byte dev_addr;//装置的地址
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20, ArraySubType = UnmanagedType.U4)]
public uint dev_yc_num;//装置的遥测数量
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20, ArraySubType = UnmanagedType.U4)]
public uint dev_yc_start;//装置的遥测起始地址
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20, ArraySubType = UnmanagedType.U4)]
public uint dev_yx_num;//装置的遥信数量
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20, ArraySubType = UnmanagedType.U4)]
public uint dev_yx_start;//装置的遥信起始地址
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20, ArraySubType = UnmanagedType.U4)]
public uint dev_dd_num;//装置的电度数量
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20, ArraySubType = UnmanagedType.U4)]
public uint dev_dd_start;//装置的电度起始地址
}
}