コード例 #1
0
 /// <summary>
 /// 将制定PLC的地址改为新的地址
 /// </summary>
 /// <param name="fOldPLCAddress">原PLC地址</param>
 /// <param name="fNewPLCAddress">新的PLC地址</param>
 public void SetPLCAddress(int fNewPLCAddress)
 {
     if (PLCActive() && (fSerialPortBus != null))
     {
         if (!string.IsNullOrEmpty(fPLCModbusNode.PLCSNStr))
         {
             int[] fDataBuf = new int[] { CRC16_GB19582.CRC16GB(fPLCModbusNode.PLCSNByteLF, TCRC16Endian.Big),
                                          fNewPLCAddress }; // 写入2个字节寄存器
             TModbusRTUCommandV2 fCommand = new TModbusRTUCommandV2(ModbusCommand.WriteMemoryReg_0x10);
             fCommand.PLCAddress      = (byte)PLCAddress;
             fCommand.RegWriteAddress = 0;       // 写入本机地址
             fCommand.RegWriteCount   = (ushort)fDataBuf.Length;
             for (int i = 0; i < fDataBuf.Length; i++)
             {
                 fCommand.RegValue[i] = (ushort)fDataBuf[i];
             }
             int fTimeOut = 100;
             fSerialPortBus.SendModbusCommand(fCommand, ref fTimeOut);
         }
     }
     else
     {
         throw new Exception("目标PLC无法操作!");
     }
 }
コード例 #2
0
 /// <summary>
 /// 写入特殊寄存器值
 /// </summary>
 /// <param name="fRegIdx">寄存器地址序号</param>
 /// <param name="fADCSet">要设置的值</param>
 public void WriteSetReg(ushort fRegIdx, ushort fADCSet)
 {
     if (PLCActive() && (fSerialPortBus != null))
     {
         int[] fDataBuf = new int[] { CRC16_GB19582.CRC16GB(fPLCModbusNode.PLCSNByteLF, TCRC16Endian.Big),
                                      fADCSet }; // 写入2个字节寄存器
         TModbusRTUCommandV2 fCommand = new TModbusRTUCommandV2(ModbusCommand.WriteMemoryReg_0x10);
         fCommand.PLCAddress      = (byte)PLCAddress;
         fCommand.RegWriteAddress = fRegIdx;       // 写入本机地址
         fCommand.RegWriteCount   = (ushort)fDataBuf.Length;
         for (int i = 0; i < fDataBuf.Length; i++)
         {
             fCommand.RegValue[i] = (ushort)fDataBuf[i];
         }
         int fTimeOut = 100;
         fSerialPortBus.SendModbusCommand(fCommand, ref fTimeOut);
     }
 }
コード例 #3
0
ファイル: ADP1701VX.cs プロジェクト: sisecha/ModeulSetTools
        public int SetPLCRunTimeCFG(ushort[] RTCFGDatas)
        {
            int fResult = 0;
            TModbusRTUCommandV2 fCommand = new TModbusRTUCommandV2(ModbusCommand.HBHCCommand_0x42);

            fCommand.PLCAddress    = (byte)PLCAddress;
            fCommand.MainCode      = 0x0A;
            fCommand.SubCode       = ADP1701VX.SubCode_SetCFG;
            fCommand.CryptKey      = (ushort)CRC16_GB19582.CRC16GB(PLCSNByteLF, TCRC16Endian.Big);
            fCommand.RegWriteCount = (ushort)RTCFGDatas.Length;
            for (int i = 0; i < fCommand.RegWriteCount; i++)
            {
                fCommand.RegValue[i] = (ushort)RTCFGDatas[i];
            }
            int fTimeOut = 100;

            fResult = base.fSerialPortBus.SendModbusCommand(fCommand, ref fTimeOut);
            return(fResult);
        }
コード例 #4
0
 /// <summary>
 /// 写入PLC的序列号;
 /// </summary>
 /// <param name="fPLCSN"></param>
 /// <param name="fPLCAddress"></param>
 public void SetPLCSN(byte[] fPLCSN)
 {
     if (PLCActive() && (fSerialPortBus != null))
     {
         if ((fPLCSN != null) && (fPLCSN.Length == 12))
         {
             List <ushort> fDataBuf = new List <ushort>();
             fDataBuf.Add((ushort)CRC16_GB19582.CRC16GB(PLCSNByteLF, TCRC16Endian.Big));
             // 将要写入的PLCSN放入,转换为ushort,高位在前,写入缓冲区
             ushort fVTemp = 0;
             for (int i = 0; i < fPLCSN.Length; i++)
             {
                 if (i % 2 == 0)     //寄存器低位: 0,2,4,6,8,10,12
                 {
                     fVTemp = fPLCSN[i];
                 }
                 else
                 {       //寄存器高位: 1,3,5,7,9,11
                     ushort fVT1 = fPLCSN[i];
                     fVTemp <<= 8;
                     fVTemp  |= fVT1;
                     fDataBuf.Add(fVTemp);
                     fVTemp = 0;
                 }
             }
             TModbusRTUCommandV2 fCommand = new TModbusRTUCommandV2(ModbusCommand.WriteMemoryReg_0x10);
             fCommand.PLCAddress      = (byte)this.PLCAddress;
             fCommand.RegWriteAddress = 2;       // 写入PLCSN,不是所有PLC都能够写入PLCSN
             fCommand.RegWriteCount   = (ushort)fDataBuf.Count;
             for (int i = 0; i < fDataBuf.Count; i++)
             {
                 fCommand.RegValue[i] = fDataBuf[i];
             }
             int fTimeOut = 100;
             fSerialPortBus.SendModbusCommand(fCommand, ref fTimeOut);
         }
     }
     else
     {
         throw new Exception("目标PLC无法操作!");
     }
 }
コード例 #5
0
        private void button1_Click(object sender, EventArgs e)
        {
            if ((radioButton1.Checked || radioButton2.Checked) && (fModelManager != null) && (fModelManager.PLCConnected))
            {
                int   fCRCValue = CRC16_GB19582.CRC16CB(fModelManager.PLCSNByteLF);
                int[] fDataBuf;
                fModelManager.Active = false;
                System.Threading.Thread.Sleep(100);
                try
                {
                    // 4-20mA测量
                    if (radioButton1.Checked)
                    {
                        for (int i = 0; i < 6; i++)
                        {
                            // 单极性测量;PGA增益=1;输入负为AGND
                            fDataBuf = new int[] { fCRCValue, 0x0009 | ((i + 1) << 4) };
                            fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 0x08 + i, fDataBuf);
                            System.Threading.Thread.Sleep(5);
                        }
                        // 快速测量模式
                        fModelManager.CFG_ADCFastMode = true;
                        // 通道2为差分方式测量片上温度温度,PGA增益=32
                        fModelManager.CFG_T2Balance = false;
                        // 写入系统配置
                        fDataBuf = new int[] { fCRCValue, fModelManager.Reg_CFG };
                        fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 0x0E, fDataBuf);
                        System.Threading.Thread.Sleep(5);
                        // 重启PLC
                        fDataBuf = new int[] { fCRCValue, 1 };
                        fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 1, fDataBuf);
                    }

                    if (radioButton2.Checked)
                    {
                        for (int i = 0; i < 6; i++)
                        {
                            // 双极性测量;PGA增益=32;输入负为AIN0.7
                            fDataBuf = new int[] { fCRCValue, 0x1507 | ((i + 1) << 4) };
                            fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 0x08 + i, fDataBuf);
                            System.Threading.Thread.Sleep(5);
                        }
                        // 慢速测量模式
                        fModelManager.CFG_ADCFastMode = false;
                        // 通道2为测量专用平衡片上的绝对电压,PGA增益=1
                        fModelManager.CFG_T2Balance = true;
                        // 写入系统配置
                        fDataBuf = new int[] { fCRCValue, fModelManager.Reg_CFG };
                        fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 0x0E, fDataBuf);
                        System.Threading.Thread.Sleep(5);
                        // 重启PLC
                        fDataBuf = new int[] { fCRCValue, 1 };
                        fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 1, fDataBuf);
                    }
                }
                finally
                {
                    fModelManager.Active = true;
                }
                this.DialogResult = DialogResult.OK;
                Close();
            }
        }