using AmrControl.Dto; using Newtonsoft.Json; using NPOI.SS.Formula.Functions; using System.IO; using System.Runtime.InteropServices; using System.Security.Policy; namespace AmrControl.ADS { [Serializable] public class JGR_Tc_Model { // 0:仓储车 , 1:运输车, 2:仓储位充电器,3:轨道位充电器 public byte jgrType; //出厂编号,30个长度带'\0',有效最多29个字节 public string jgrSN; //车ID,取值范围0~63,不同类型的车/充电器的jgrID可以重复 public byte jgrID; //无线模块的地址,长度2字节 public ushort rcAddr; //无线模块的频率码,取值0~155,对应频率为 900+RC_FreqCode*0.2,单位MHz,默认频率码为0x32(50) public byte rcFreqCode; //在线/离线状态 是否在线(通讯是否正常) public byte isOnline; //健康状态 =0:正常; >=1:异常,异常编码看接口给 public byte isHealthy; //充电标志,1:充电中,0:未在充电 public byte isCharging; //充电电压,单位:V public float chargeVoltage; //充电电流,单位:mA public float chargeCurrent; //电池剩余电量,取值 0~100 , 100表示满电量 public byte electricity; //驱动器通电/断电状态 public byte isDriverPowerOn; //(*工作模式 //1: 正常工作模式,即自动控制模式,只需给出运动的目标坐标,动作序列小车自己控制,正常工作时使用; //2:调试模式,即手动控制模式,用于调试,每一个动作都需要发送指令*) public byte workMode; //车轮位置(车身姿态) =1高姿态,=2中姿态,=3低姿态 public byte wheelPosition; //行进/停止状态 //(* 车体运动状态 //0:静止状态 //1:X负向移动 //2:X正向移动 //3:Y负向移动 //4:Y正向移动*) public byte moveStatus; //移动速度,单位:m/s public float moveSpeed; //当前位置X public short currLocation_X; //当前位置Y public short currLocation_Y; //目标位置X public short destLocation_X; //目标位置Y public short destLocation_Y; /// /// 显示位置X,Y坐标 /// public int displayX; public int displayY; //车轮是否在位置切换中 public byte isWheelAltering; //4个碰撞传感器,true:碰撞,false:未碰撞 public byte[] collideSensor; //X加速度,单位 m/s2 public float acceleration_X; //Y加速度,单位 m/s2 public float acceleration_Y; //Z加速度,单位 m/s2 public float acceleration_Z; //XZ角度,单位:° public float angleXZ; //YZ角度,单位:° public float angleYZ; //吊篮限位标志,吊篮处于的位置 0:最高点; 1~7层 public byte basketPosition; //吊篮抓夹状态 1:闭合状态; 2:张开状态 public byte basketGripperStatus; //吊篮是否在移动,吊篮运动状态 吊篮运动状态 0:静止; 1:正在上提; 2:正在下放 public byte basketMoveStatus; //RFID public string rfid; /// /// 需要移动的路径 /// [JsonIgnore] public List movingPaths; public JGR_Tc_Model() { collideSensor = new byte[4]; movingPaths = new List(); } public int GetPathCounts() { int count = 0; lock(this) { count = movingPaths.Count; } return count; } public MovingPath GetFirstPath() { MovingPath path = null; lock (this) { if(movingPaths.Count > 0) { path = movingPaths[0]; } } return path; } public MovingPath RemoveFirstPath() { MovingPath path = null; lock (this) { if (movingPaths.Count > 0) { path = movingPaths[0]; movingPaths.RemoveAt(0); } } return path; } public void ClearPath() { lock (this) { movingPaths.Clear(); } } /// /// 如果对象为空,可以加入,表示当前这辆车只能执行一组动作 /// /// public void AddPath(List paths) { lock (this) { if(movingPaths.Count == 0) { movingPaths.AddRange(paths); } } } } //用内存对齐方式并不对,可能是和TC程序接口是C#开发的有关 [StructLayout(LayoutKind.Sequential, Pack = 1)] /// /// TC程序中定义的JGR小车的数据结构 /// [Serializable] public struct JGR_Ads_Struct { //出厂编号,30个长度带'\0',有效最多29个字节 [JsonConverter(typeof(TcModelArrayConverter))] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)] public byte[] jgrSN; // 0:仓储车 , 1:运输车, 2:仓储位充电器,3:轨道位充电器 public byte jgrType; //车ID,取值范围0~63,不同类型的车/充电器的jgrID可以重复 public byte jgrID; //无线模块的地址,长度2字节 public ushort rcAddr; //无线模块的频率码,取值0~155,对应频率为 900+RC_FreqCode*0.2,单位MHz,默认频率码为0x32(50) public byte rcFreqCode; //在线/离线状态 是否在线(通讯是否正常) public byte isOnline; //健康状态 true:正常; false:异常 public byte isHealthy; //充电标志,1:充电中,0:未在充电 public byte isCharging; //充电电压,单位:V public float chargeVoltage; //充电电流,单位:mA public float chargeCurrent; //电池剩余电量,取值 0~100 , 100表示满电量 public byte electricity; //驱动器通电/断电状态 public byte isDriverPowerOn; //(*工作模式 //1: 正常工作模式,即自动控制模式,只需给出运动的目标坐标,动作序列小车自己控制,正常工作时使用; //2:调试模式,即手动控制模式,用于调试,每一个动作都需要发送指令*) public byte workMode; //车轮位置(车身姿态) =1高姿态,=2中姿态,=3低姿态 public byte wheelPosition; //行进/停止状态 //(* 车体运动状态 //0:静止状态 //1:X负向移动 //2:X正向移动 //3:Y负向移动 //4:Y正向移动*) public byte moveStatus; //移动速度,单位:m/s public float moveSpeed; //当前位置X public short currLocation_X; //当前位置Y public short currLocation_Y; //目标位置X public short destLocation_X; //目标位置Y public short destLocation_Y; //车轮是否在位置切换中 public byte isWheelAltering; //4个碰撞传感器,true:碰撞,false:未碰撞 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] collideSensor; //X加速度,单位 m/s2 public float acceleration_X; //Y加速度,单位 m/s2 public float acceleration_Y; //Z加速度,单位 m/s2 public float acceleration_Z; //XZ角度,单位:° public float angleXZ; //YZ角度,单位:° public float angleYZ; //吊篮限位标志,吊篮处于的位置 1:最高点; 2:最低点 public byte basketPosition; //吊篮抓夹状态 1:闭合状态; 2:张开状态 public byte basketGripperStatus; //吊篮是否在移动,吊篮运动状态 吊篮运动状态 0:静止; 1:正在上提; 2:正在下放 public byte basketMoveStatus; //RFID [JsonConverter(typeof(TcModelArrayConverter))] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] public byte[] rfid; } /// /// 车、充电桩的类型 /// public enum JgrType : byte { /// /// 仓储车 /// StorageCar = 0, /// /// 轨道车 /// RailCar = 1, /// /// 仓储充电桩 /// StorageCharging = 2, /// /// 轨道充电桩 /// RailCharging = 3 } }