SOMS/test/Iec104ComService/Client104Side/ICE104EndPointController.cs
2024-07-15 10:31:26 +08:00

275 lines
14 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.Runtime.InteropServices;
namespace Client104Side
{
public class ICE104EndPointController
{
public ICE104EndPointController()
{
string[] test = new string[20];
}
/// <summary>
/// 结构体转IntPtr
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="info"></param>
/// <returns></returns>
public static IntPtr StructToIntPtr<T>(T info)
{
int size = Marshal.SizeOf(info);
IntPtr intPtr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(info, intPtr, true);
return intPtr;
}
/// <summary>
/// IntPtrz转结构体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="info"></param>
/// <returns></returns>
public static T IntPtrToStruct<T>(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";
/// <summary>
/// 启动104客户端
/// </summary>
/// <param name="cln104_param"></param>
/// <param name="callback_dev_on"></param>
/// <param name="callback_dev_off"></param>
/// <returns>返回值 0启动成功返回值<0: 启动失败。若启动失败,检查下各配置文件是否完备,各配置文件是否按照要求进行了配置。</returns>
[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);
/// <summary>
/// 获取装置的TCP连接状态该状态写入参数commState中
/// </summary>
/// <param name="devAddr">装置地址</param>
/// <param name="commState">保存连接状态</param>
/// <returns>返回值 0获取状态成功此时commState指示的状态有效commState大于等于3 表示已经建立TCP连接返回值 -1获取状态失败此时commState指示的状态无效。可能是该装置地址没有在Config.ini中配置</returns>
[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);
/// <summary>
/// *获取装置的协议连接状态
/// </summary>
/// <param name="addr">装置地址</param>
/// <returns>返回值 0装置在线此时可以下发总召唤、遥控等命令返回值 -1装置不在线。装置104从站还未与104主站连接上</returns>
[DllImport(DLLPath, EntryPoint = "iec104cln_get_dev_status", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104GetDevStatus(byte addr);
/// <summary>
/// *获取装置的总召状态
/// </summary>
/// <param name="addr">装置地址</param>
/// <returns>返回值 0装置已经总召唤完成可以读取遥信遥测返回值 -1传入的装置地址错误或装置还未完成总召唤遥信遥测不可用</returns>
[DllImport(DLLPath, EntryPoint = "iec104cln_get_dev_callstatus", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnGetDevCallStatus(byte addr);
/// <summary>
/// 关闭104客户端
/// </summary>
/// <returns>返回值 0关闭成功返回值<0: 关闭失败</returns>
[DllImport(DLLPath, EntryPoint = "iec104cln_end", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnEnd();
/// <summary>
/// 获取遥测值
/// </summary>
/// <param name="dev_addr">装置地址</param>
/// <param name="dev_sector">装置扇区</param>
/// <param name="dev_inf">装置信息序号</param>
/// <param name="yc_val">存储获取的遥测值</param>
/// <returns>返回值 0获取成功此时yc_val保存的值有效返回值 -1获取失败此时yc_val保存的值无效。可能是点表中没有与(地址、扇区、inf) 这个三元素 匹配的条目</returns>
[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);
/// <summary>
/// 获取遥信值
/// </summary>
/// <param name="dev_addr">装置地址</param>
/// <param name="dev_sector"> 装置扇区 </param>
/// <param name="dev_inf"> 装置信息序号</param>
/// <param name="yx_val">存储获取的遥信值遥信为双点遥信。遥信为0x83表示该遥信装置未上送</param>
/// <returns>返回值 0获取成功此时yx_val保存的值有效 返回值 -1获取失败此时yx_val保存的值无效。可能是点表中没有与(地址、扇区、inf) 这个三元素 匹配的条目</returns>
[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);
/// <summary>
/// 获取电度值
/// </summary>
/// <param name="dev_addr">装置地址</param>
/// <param name="dev_sector"> 装置扇区 </param>
/// <param name="dev_inf"> 装置信息序号</param>
/// <param name="dd_val">存储获取的电度值</param>
/// <returns> 返回值 0获取成功此时dd_val保存的值有效返回值 -1获取失败此时dd_val保存的值无效。可能是点表中没有与(地址、扇区、inf) 这个三元素 匹配的条目</returns>
[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);
/// <summary>
/// 下发遥控命令
/// </summary>
/// <param name="dev_addr">装置地址</param>
/// <param name="dev_sector"> 装置扇区 </param>
/// <param name="dev_inf"> 装置信息序号</param>
/// <param name="yk_dco">2 控合1控分</param>
/// <returns>返回值 0下发遥控命令成功返回值 -1下发遥控命令失败。可能是装置104从站还未与104主站连接上或者该装置地址没有在Config.ini中配置</returns>
[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);
/// <summary>
/// 总召唤 0 通信状态总召唤 1 遥信遥测总召唤 2 电度总召唤
/// </summary>
/// <param name="call_type">总召唤类型获取遥信遥测请使用IEC104_YX_CALL</param>
/// <param name="dev_addr">装置地址</param>
/// <returns>返回值 0下发总召唤命令成功返回值 -1下发总召唤命令失败。可能是装置104从站还未与104主站连接上或者该装置地址没有在Config.ini中配置</returns>
[DllImport(DLLPath, EntryPoint = "iec104cln_call", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnCall(byte call_type, byte dev_addr);
/// <summary>
/// 读取遥信变位缓冲区
/// </summary>
/// <param name="yx_burst">读取到的遥信变位存储在这个参数中</param>
/// <returns>返回值0成功读取-1未读取读取失败是因为缓冲区已读完</returns>
[DllImport(DLLPath, EntryPoint = "iec104cln_read_yx_burst_record", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnReadYXBurstRecord(IntPtr yx_burst);
/// <summary>
/// 获取数据(遥测、遥信、电度)缓冲区,每次调用自动偏移读取指针
/// </summary>
/// <param name="yc_burst">遥测缓冲区数据</param>
/// <returns>返回值0成功获取数据-1数据未变化-2到达缓冲区末尾</returns>
[DllImport(DLLPath, EntryPoint = "iec104cln_get_yc_buf", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnGetYCBuf(IntPtr yc_burst);
/// <summary>
/// 获取数据(遥测、遥信、电度)缓冲区,每次调用自动偏移读取指针
/// </summary>
/// <param name="yx_burst">遥信缓冲区数据</param>
/// <returns>返回值0成功获取数据-1数据未变化-2到达缓冲区末尾</returns>
[DllImport(DLLPath, EntryPoint = "iec104cln_get_yx_buf", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnGetYXBuf(IntPtr yx_burst);
/// <summary>
/// 获取数据(遥测、遥信、电度)缓冲区,每次调用自动偏移读取指针
/// </summary>
/// <param name="dd_burst">电度缓冲区数据</param>
/// <returns>返回值0成功获取数据-1数据未变化-2到达缓冲区末尾</returns>
[DllImport(DLLPath, EntryPoint = "iec104cln_get_dd_buf", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Iec104ClnGetDDBuf(IntPtr dd_burst);
}
/// <summary>
/// cbt add 2020.3.11 104主站动态库 电度
/// </summary>
[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;
}
/// <summary>
/// cbt add 2020.4.2 增加遥信、遥测、电度的自定义结构体
/// </summary>
[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;
}
;
/// <summary>
/// cbt add 2020.3.11 104主站动态库 遥信
/// </summary>
[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;
}
;
/// <summary>
/// cbt add 2020.3.11 104主站动态库 增加变位遥信循环缓冲区
/// </summary>
[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;
}
/// <summary>
/// cbt add 2020.3.11 104动态库启动不读配置文件所有配置从参数传入
/// </summary>
[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;//装置的电度起始地址
}
}