Exemple #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无法操作!");
     }
 }
        private void buttonOpenPLC_Click(object sender, EventArgs e)
        {
            fSerialPLC.ClearAllPLCNode();
            ModulForm = null;

            TModbusRTUCommandV2 fCommand = new TModbusRTUCommandV2(ModbusCommand.ReadMemoryReg_0x03);

            fCommand.PLCAddress      = (byte)numericUpDownDestPLCAddress.Value;
            fCommand.RegReadAddress  = 0;
            fCommand.RegReadCount    = 1;
            fCommand.OnGetRTURespon += FCommand_OnGetRTURespon;
            int fTimeOut = 100;

            fSerialPLC.SendModbusCommand(fCommand, ref fTimeOut);
        }
Exemple #3
0
 /// <summary>
 /// 写入寄存器值
 /// </summary>
 /// <param name="fRegStar">目标寄存器起始地址</param>
 /// <param name="fRegValue">等待写入的数据</param>
 public void WriteReg(ushort fRegStar, ushort[] fRegValue)
 {
     if (PLCActive() && (fSerialPortBus != null))
     {
         TModbusRTUCommandV2 fCommand = new TModbusRTUCommandV2(ModbusCommand.WriteMemoryReg_0x10);
         fCommand.PLCAddress      = (byte)PLCAddress;
         fCommand.RegWriteAddress = fRegStar;       // 写入本机地址
         fCommand.RegWriteCount   = (ushort)fRegValue.Length;
         for (int i = 0; i < fRegValue.Length; i++)
         {
             fCommand.RegValue[i] = fRegValue[i];
         }
         int fTimeOut = 100;
         fSerialPortBus.SendModbusCommand(fCommand, ref fTimeOut);
     }
 }
Exemple #4
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);
     }
 }
Exemple #5
0
        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);
        }
Exemple #6
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无法操作!");
     }
 }
        private void FCommand_OnGetRTURespon(object sender)
        {
            TModbusRTUCommandV2 fCommand = (TModbusRTUCommandV2)sender;

            panelBusManager.Enabled = false;
            ZLPLCModbusNode fPLCNode = null;

            switch (comboBoxPLCType.SelectedIndex)
            {
            case 0:
                fPLCNode = new ZLPLCModbusNode(fCommand.PLCAddress, ModulePLCBase.RegStar, ModulePLCBase.SystemRegCount);
                fSerialPLC.AddNewPLCNode(fPLCNode);
                fPLCNode.IntervalOfFlash = 1000;
                ModulForm = new FModuleSetBase(fPLCNode, fSerialPLC);
                break;

            case 1:
                fPLCNode = new ZLPLCModbusNode(fCommand.PLCAddress, F350YBExtPLC.RegStar, F350YBExtPLC.PLCRegCount);
                fSerialPLC.AddNewPLCNode(fPLCNode);
                fPLCNode.IntervalOfFlash = 1000;
                ModulForm = new FF350_YBExt(fPLCNode, fSerialPLC);
                break;

            case 2:
                fPLCNode = new ZLPLCModbusNode(fCommand.PLCAddress, ADP1701VX.RegStar, ADP1701VX.PLCRegCount);
                fSerialPLC.AddNewPLCNode(fPLCNode);
                fPLCNode.IntervalOfFlash = 1000;
                ModulForm = new FADP1701VX(fPLCNode, fSerialPLC);
                break;

            default:
                break;
            }
            if (ModulForm != null)
            {
                ModulForm.FormClosed += ModulForm_FormClosed;
                ((LModuleSetTool)ModulForm).SetParent(groupBoxPLCInfo);
            }
        }
Exemple #8
0
        public int GetPLCRunTimeCFG(out byte[] RTCFGDatas)
        {
            RTCFGDatas = new byte[0];

            TModbusRTUCommandV2 fCommand = new TModbusRTUCommandV2(ModbusCommand.HBHCCommand_0x42);

            fCommand.PLCAddress = (byte)this.PLCAddress;
            fCommand.MainCode   = 0x03;
            fCommand.SubCode    = SubCode_GetCFG;
            fCommand.CryptKey   = 0;
            int fTimeOut = 100;
            int fResult  = base.fSerialPortBus.SendModbusCommand(fCommand, ref fTimeOut);

            if ((fResult > 0) && fCommand.HasReply)
            {
                RTCFGDatas = new byte[fCommand.ReplyValues.Length * 2];
                for (int i = 0; i < fCommand.ReplyValues.Length; i++)
                {
                    RTCFGDatas[2 * i + 0] = (byte)((fCommand.ReplyValues[i] >> 8) & 0xFF);
                    RTCFGDatas[2 * i + 1] = (byte)(fCommand.ReplyValues[i] & 0xFF);
                }
            }
            return(fResult);
        }