using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO.Ports; using System.Threading; using System.Windows.Forms; namespace Tps_LQ_Transmitter.com { /// /// DIO控制板与JSY电压电流模拟量采集模块 控制类。 /// [DIO控制板与JSY模块都是RS485通信共用计算机的串口COM6]。 /// public class DioControlClass:MySerial { SerialPort serial = null; public enum State {ON,OFF}; public DioControlClass() { serial = new SerialPort(); serial.PortName = "COM6"; //DIO控制板与JSY模块都是RS485通信共用计算机的串口COM6 serial.BaudRate = 9600; serial.DataBits = 8; serial.StopBits = StopBits.One;//停止位设置为com_stop的值 serial.Parity = Parity.None;//获取奇偶校验选项的值 serial.ReadTimeout = 1000; //读取等待时间1000 serial.RtsEnable = true; if (!serial.IsOpen) { serial.Open(); Thread.Sleep(50); } } public override void portClose() { serial.Close(); } #region DIO /// /// DIO输出控制 /// /// 控制通道号0-16 /// 控制状态ON/OFF public void DioOutput(int ch, State st) { byte[] byCh = { 0x7E, 0x7E, 0x01, 0x01, 0x00, 0x01, 0x0D, 0x0A }; byCh[4] = (byte)ch; if (st== State.ON) { byCh[5] = 0x01; } else { byCh[5] = 0x00; } if (serial.IsOpen==true) { serial.Write(byCh, 0, byCh.Length); Thread.Sleep(50); } } /// /// 供电开关 /// /// 通道号(从1开始) /// ON/off public void SupplySwitch(int ch, State st) { if (ch>=1&&ch<=8) { ch = ch - 1; DioOutput(ch, st); } else { MessageBox.Show("超出通道号范围", "提示"); } } /// /// 一分八射频开关控制 /// /// /// public void OneToEight(int ch,State st) { int chPlay = 16; switch (ch) { case 1: chPlay = 16; break; case 2: chPlay = 17; break; case 3: chPlay = 18; break; case 4: chPlay = 19; break; case 5: chPlay = 20; break; case 6: chPlay = 21; break; case 7: chPlay = 22; break; case 8: chPlay = 23; break; default: break; } for (int i = 0; i < 8; i++) { DioOutput(16+i, State.OFF); Thread.Sleep(5); } DioOutput(chPlay, st); } /// /// 一分四射频开关控制 /// /// /// public void OneToFour(int ch, State st) { int chPlay = 11; switch (ch) { case 1: chPlay = 11; break; case 2: chPlay = 12; break; case 3: chPlay = 13; break; case 4: chPlay = 14; break; default: break; } for (int i = 0; i < 4; i++) { DioOutput(11 + i, State.OFF); Thread.Sleep(5); } DioOutput(chPlay, st); } /// /// 仪器接入(一分四射频开关控制) /// /// public void RfSwitchX(string str) { if (str=="功率计") { OneToFour(1,State.ON); } else if (str == "频谱仪") { OneToFour(2, State.ON); } else if (str == "解调入") { OneToFour(3, State.ON); } else { OneToFour(4, State.OFF); } } /// /// 一分二射频开关控制(多模解调模块切换) /// /// public void OneToTwo( State st) { int chPlay = 15; DioOutput(chPlay, st); } #endregion #region JSY /// /// JSY电压电流模拟量采集查询 /// /// /// 采集数据byte[] public byte[] QueryJSY(byte[] data,int delay=150) { if (data == null) return null; //先读空 if (serial.BytesToRead > 0) serial.DiscardInBuffer(); byte[] crc = crc16(data); byte[] newarray = new byte[data.Length + 2]; Array.Copy(data, newarray, data.Length); newarray[data.Length] = crc[0]; newarray[data.Length + 1] = crc[1]; serial.Write(newarray, 0, newarray.Length); Thread.Sleep(delay); if (serial.BytesToRead > 0) { byte[] dat = new byte[serial.BytesToRead]; serial.Read(dat, 0, dat.Length); return dat; } else { return null; } } /// /// JSY模块单通道电压(V)读取 /// /// 通道号(从1开始) /// 电压值 public double ReadVolt(int ch) { double volt=0; byte[] command = {0x01,0x03,0x00,0x70,0x00,0x01}; byte[] rddat = new byte[7]; byte[] dat = new byte[5]; switch (ch) { case 1: command[3] = 0x70; break; case 2: command[3] = 0x71; break; case 3: command[3] = 0x72; break; case 4: command[3] = 0x73; break; case 5: command[3] = 0x74; break; case 6: command[3] = 0x75; break; case 7: command[3] = 0x76; break; case 8: command[3] = 0x77; break; default: command[3] = 0x70; break; } rddat = QueryJSY(command); for (int i = 0; i < 5; i++) { dat[i] = rddat[i]; } byte[] crcval=crc16(dat); if (rddat[5]== crcval[0] && rddat[6] == crcval[1]) { ushort dat1=(ushort)((rddat[3] << 8) + rddat[4]); volt = dat1 / 100.0; } return volt; } /// /// JSY模块8个通道电压(V)同时读取 /// /// 电压值数组double[] public double[] ReadAllVolt() { double[] volt = new double[8]; byte[] command = { 0x01, 0x03, 0x00, 0x70, 0x00, 0x08 }; byte[] rddat = new byte[21]; byte[] dat = new byte[19]; rddat = QueryJSY(command); for (int i = 0; i < 19; i++) { dat[i] = rddat[i]; } byte[] crcval = crc16(dat); if (rddat[19] == crcval[0] && rddat[20] == crcval[1]) { for (int i = 0; i < 8; i++) { ushort dat1 = (ushort)((rddat[3 + 2 * i] << 8) + rddat[4 + 2 * i]); volt[i] = dat1 / 100.0; } } return volt; } /// /// JSY模块单通道电流(A)读取 /// /// 通道号(从1开始) /// 电流值 public double ReadCurr(int ch) { double curr = 0; byte[] command = { 0x01, 0x03, 0x00, 0x78, 0x00, 0x01 }; byte[] rddat = new byte[7]; byte[] dat = new byte[5]; switch (ch) { case 1: command[3] = 0x78; break; case 2: command[3] = 0x79; break; case 3: command[3] = 0x7A; break; case 4: command[3] = 0x7B; break; case 5: command[3] = 0x7C; break; case 6: command[3] = 0x7D; break; case 7: command[3] = 0x7E; break; case 8: command[3] = 0x7F; break; default: command[3] = 0x78; break; } rddat = QueryJSY(command); for (int i = 0; i < 5; i++) { dat[i] = rddat[i]; } byte[] crcval = crc16(dat); if (rddat[5] == crcval[0] && rddat[6] == crcval[1]) { ushort dat1 = (ushort)((rddat[3] << 8) + rddat[4]); curr = dat1 / 1000.0; } return curr; } /// /// JSY模块8个通道电流(A)同时读取 /// /// 电流值数组double[] public double[] ReadAllCurr() { double[] curr = new double[8]; byte[] command = { 0x01, 0x03, 0x00, 0x78, 0x00, 0x08 }; byte[] rddat = new byte[21]; byte[] dat = new byte[19]; rddat = QueryJSY(command); for (int i = 0; i < 19; i++) { dat[i] = rddat[i]; } byte[] crcval = crc16(dat); if (rddat[19] == crcval[0] && rddat[20] == crcval[1]) { for (int i = 0; i < 8; i++) { ushort dat1 = (ushort)((rddat[3 + 2 * i] << 8) + rddat[4 + 2 * i]); curr[i] = dat1 / 1000.0; } } return curr; } /// /// JSY模块单通道供电功率(W)读取 /// /// 通道号 /// 电流值 public double ReadPower(int ch) { double power = 0; byte[] command = { 0x01, 0x03, 0x00, 0x80, 0x00, 0x01 }; byte[] rddat = new byte[7]; byte[] dat = new byte[5]; switch (ch) { case 1: command[3] = 0x80; break; case 2: command[3] = 0x81; break; case 3: command[3] = 0x82; break; case 4: command[3] = 0x83; break; case 5: command[3] = 0x84; break; case 6: command[3] = 0x85; break; case 7: command[3] = 0x86; break; case 8: command[3] = 0x87; break; default: command[3] = 0x80; break; } rddat = QueryJSY(command); for (int i = 0; i < 5; i++) { dat[i] = rddat[i]; } byte[] crcval = crc16(dat); if (rddat[5] == crcval[0] && rddat[6] == crcval[1]) { ushort dat1 = (ushort)((rddat[3] << 8) + rddat[4]); power = dat1 / 1.0; } return power; } /// /// JSY模块8个通道的供电功率(W)同时读取 /// /// 电流值数组double[] public double[] ReadAllPower() { double[] power = new double[8]; byte[] command = { 0x01, 0x03, 0x00, 0x80, 0x00, 0x08 }; byte[] rddat = new byte[21]; byte[] dat = new byte[19]; rddat = QueryJSY(command); for (int i = 0; i < 19; i++) { dat[i] = rddat[i]; } byte[] crcval = crc16(dat); if (rddat[19] == crcval[0] && rddat[20] == crcval[1]) { for (int i = 0; i < 8; i++) { ushort dat1 = (ushort)((rddat[3 + 2 * i] << 8) + rddat[4 + 2 * i]); power[i] = dat1 / 1.0; } } return power; } #endregion } }