程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於C#如何使用Prodave(實戰DllImport)(3)

關於C#如何使用Prodave(實戰DllImport)(3)

編輯:關於C語言

(4)對了,如果是對象型的引用,比如unsigned char*轉成byte[],是 不需要加ref,但如果是c++ int轉 c# int 則要加ref關鍵字。

要說明的就是這些,下面請各位看官看看我的轉換代碼吧,還請見教:

    public class Prodave6
    {
        #region 常值定義(用於極限值)
         public const int MAX_CONNECTIONS = 64; // 64 is default in PRODAVE
        public const int MAX_DEVNAME_LEN = 128;// e.g. "S7ONLINE"
        public const int MAX_BUFFERS = 64; // 64 for blk_read() and blk_write()
        public const int MAX_BUFFER = 65536; // Transfer buffer for error text)
        #endregion

        #region 結構體定義
        public struct CON_TABLE_TYPE//待連接plc地址屬性表
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
             //public CON_ADR_TYPE Adr; // connection address
            public byte[] Adr; // connection address
            // MPI/PB station address (2)
            // IP address (192.168.0.1)
            // Mac address (08-00-06-01-AA-BB)
            public byte AdrType; // Type of address: MPI/PB (1), IP (2), Mac (3)
            public byte SlotNr; // Slot number
             public byte RackNr; // Rack number
        }
        public enum DatType : byte//PLC數據類型
        {
            BYTE = 0x02,
            Word = 0x04,
             DWord = 0x06,
        }
        public enum FIEldType : byte//PLC區域類型
        {
            //Value types as ASCII characters區域類型對應的ASCII字符
            //data byte (d/D)
            d = 100,
            D = 68,
            //input byte (e/E)
            e = 101,
            E = 69,
            //output byte (a/A)
            a = 97,
            A = 65,
            //memory byte (m/M)
            m = 109,
            M = 77,
            //timer Word (t/T),
            t = 116,
            T = 84,
        }
        #endregion

        #region PLC基本函數

        [DllImport("Prodave6.dll")]//連 接PLC操作
        //參數:連接號(0-63)、常值"S7ONLINE"、待連接plc地址屬性表長度(字節為單位,常值9) 、待連接plc地址屬性表
        public extern static int LoadConnection_ex6(int ConNr, string pAccessPoint, int ConTableLen, ref  CON_TABLE_TYPE pConTable);

        [DllImport("Prodave6.dll")]//斷開PLC操作
        //參數:連接號(0-63)
        public extern static int UnloadConnection_ex6(UInt16 ConNr);

        [DllImport("Prodave6.dll")]//激活PLC連接操作
        //參數:連接號(0-63)
        public extern static int SetActiveConnection_ex6(UInt16 ConNr);

        [DllImport ("Prodave6.dll")]//PLC db區讀取操作
        //參數:data block號、要讀取的數據類型、起始地址號、需要讀 取類型的數量、緩沖區長度(字節為單位)、緩沖區、緩沖區數據交互的長度
        public extern static int db_read_ex6(UInt16 BlkNr, DatType DType, UInt16 StartNr, ref UInt32 pAmount, UInt32 BufLen,
            byte [] pBuffer, ref UInt32 pDatLen);

        [DllImport("Prodave6.dll")]//PLC db區寫入操作
         //參數:data block號、要寫入的數據類型、起始地址號、需要寫入類型的數量、緩沖區長度(字節為單位)、緩沖區
         public extern static int db_write_ex6(UInt16 BlkNr, DatType Type, UInt16 StartNr, ref UInt32 pAmount, UInt32 BufLen,
            byte[] pBuffer);

        [DllImport("Prodave6.dll")]//PLC 任 意區讀取操作
        //參數:要讀取的區類型、data block號(DB區特有,默認為0)、起始地址號、需要讀取類型的數量、
        //緩沖區長度(字節為單位)、緩沖區、緩沖區數據交互的長度
        public extern static int field_read_ex6(FIEldType FType, UInt16 BlkNr, UInt16 StartNr, UInt32 pAmount, UInt32 BufLen,
            byte[] pBuffer, ref UInt32 pDatLen);

        [DllImport("Prodave6.dll")]//PLC 任意區寫入操作
        //參數:要寫入的區類型、data block號(DB區特有,默認為0)、起始地址號、需要寫入類型的數量、
         //緩沖區長度(字節為單位)、緩沖區
        public extern static int field_write_ex6(FIEldType FType, UInt16 BlkNr, UInt16 StartNr, UInt32 pAmount, UInt32 BufLen,
            byte[] pBuffer);

        [DllImport("Prodave6.dll")]//PLC M區某字節的某位讀取操作
        //參數:M區字節號、位號、當前的值 (0/1)
        public extern static int mb_bittest_ex6(UInt16 MbNr, UInt16 BitNr, ref int pValue);

         [DllImport("Prodave6.dll")]//PLC M區某字節的某位寫入操作
        //參數:M區字節號、位號、要 寫入的值(0/1)
        public extern static int mb_setbit_ex6(UInt16 MbNr, UInt16 BitNr, byte Value);

        #endregion

        #region PLC200用數據傳輸函數

        [DllImport ("Prodave6.dll")]//200系列PLC 任意區讀取操作
        //參數:要讀取的區類型、data block號(DB區特有,默 認為0)、起始地址號、需要讀取類型的數量、
        //緩沖區長度(字節為單位)、緩沖區、緩沖區數據交互的長度
         public extern static int as200_field_read_ex6(FIEldType FType, UInt16 BlkNr, UInt16 StartNr, UInt32 pAmount, UInt32 BufLen,
            byte[] pBuffer, ref UInt32 pDatLen);

        [DllImport ("Prodave6.dll")]//200系列PLC 任意區寫入操作
        //參數:要寫入的區類型、data block號(DB區特有,默 認為0)、起始地址號、需要寫入類型的數量、
        //緩沖區長度(字節為單位)、緩沖區
        public extern static int as200_field_write_ex6(FIEldType FType, UInt16 BlkNr, UInt16 StartNr, UInt32 pAmount, UInt32 BufLen,
             byte[] pBuffer);

        [DllImport("Prodave6.dll")]//200系列PLC M區某字節的 某位讀取操作
        //參數:M區字節號、位號、當前的值(0/1)
        public extern static int as200_mb_bittest_ex6(UInt16 MbNr, UInt16 BitNr, ref int pValue);

        [DllImport ("Prodave6.dll")]//200系列PLC M區某字節的某位寫入操作
        //參數:M區字節號、位號、要寫入的值(0/1)
        public extern static int as200_mb_setbit_ex6(UInt16 MbNr, UInt16 BitNr, byte Value);

         #endregion

        #region PLC數據轉換函數

        [DllImport ("Prodave6.dll")]//診斷錯誤信息操作
        //參數:錯誤代號、緩沖區大小(字節為單位)、緩沖區
         public extern static int GetErrorMessage_ex6(int ErrorNr, UInt32 BufLen, [MarshalAs(UnmanagedType.LPStr)] StringBuilder pBuffer);

        [DllImport("Prodave6.dll")]//S7浮點數轉換成PC浮點數
         //參數:S7浮點數、PC浮點數
        public extern static int gp_2_float_ex6(UInt32 gp, ref float pIEee);

        [DllImport("Prodave6.dll")]//PC浮點數轉換成S7浮點數
        //參數:PC浮點數、S7 浮點數
        public extern static int float_2_gp_ex6(float IEee, ref UInt32 pgp);

        [DllImport("Prodave6.dll")]//檢測某字節的某位的值是0或1
        //參數:字節值、位號
         public extern static int testbit_ex6(byte Value, int BitNr);

        [DllImport ("Prodave6.dll")]//檢測某字節的byte值轉換成int數組
        //參數:byte值、int數組(長度為8)
         public extern static void byte_2_bool_ex6(byte Value, int[] pBuffer);


        [DllImport ("Prodave6.dll")]//檢測某字節的int數組轉換成byte值
        //參數:int數組(長度為8)
        public extern static byte bool_2_byte_ex6(int[] pBuffer);

        [DllImport("Prodave6.dll")]//交 換數據的高低字節——16位數據
        //參數:待交換的數據
        public extern static UInt16 kf_2_integer_ex6(UInt16 wValue);//16位數據——Word

        [DllImport ("Prodave6.dll")]//交換數據的高低字節——32位數據
        //參數:待交換的數據
         public extern static UInt32 kf_2_long_ex6(UInt32 dwValue);//32位數據——DWord

        [DllImport("Prodave6.dll")]//交換數據緩沖區的的高低字節區,例如pBuffer[0]與pBuffer[1],pBuffer[2]與pBuffer[3]交換
        //參數:待交換的數據緩沖區,要交換的字節數,如Amount=pBuffer.Length,則交換全部緩沖
        public extern static void swab_buffer_ex6(byte[] pBuffer, UInt32 Amount);

        [DllImport ("Prodave6.dll")]//復制數據緩沖區
        //參數:目的數據緩沖區,源數據緩沖區,要復制的數量(字節為單 位)
        public extern static void copy_buffer_ex6(byte[] pTargetBuffer, byte[] pSourceBuffer, UInt32 Amount);

        [DllImport("Prodave6.dll")]//把二進制數組傳換成BCD碼的數組——16位數據
        //參數:要處理的數組,要處理的字節數,轉換前是否先交換高低字節,轉換後是否要交換高低字節
         //InBytechange為1則轉換BCD碼之前,先交換高低字節
        //OutBytechange為1則轉換BCD碼之後,再交換高低字節
        //如果InBytechange和OutBytechange都沒有置1,則不發生高低位的交換
        //16位數據BCD碼值的 許可范圍是:+999 —— -999
        public extern static void ushort_2_bcd_ex6(UInt16[] pwValues, UInt32 Amount, int InBytechange, int OutBytechange);//16位數據——Word

        [DllImport ("Prodave6.dll")]//把二進制數組傳換成BCD碼的數組——32位數據
        //參數:要處理的數組,要 處理的字節數,轉換前是否先交換高低字節,轉換後是否要交換高低字節
        //InBytechange為1則轉換BCD碼之前,先交換 高低字節
        //OutBytechange為1則轉換BCD碼之後,再交換高低字節
        //如果InBytechange和 OutBytechange都沒有置1,則不發生高低位的交換
        //32位數據BCD碼值的許可范圍是:+9 999 999 —— -9 999 999
        public extern static void ulong_2_bcd_ex6(UInt32[] pdwValues, UInt32 Amount, int InBytechange, int OutBytechange);//32位數據——DWord

        [DllImport("Prodave6.dll")]//把BCD碼的數 組傳換成二進制數組——16位數據
        //參數:要處理的數組,要處理的字節數,轉換前是否先交換高低字節, 轉換後是否要交換高低字節
        //InBytechange為1則轉換BCD碼之前,先交換高低字節
        //OutBytechange為1則轉換BCD碼之後,再交換高低字節
        //如果InBytechange和OutBytechange都沒有置1,則不發生高 低位的交換
        //16位數據BCD碼值的許可范圍是:+999 —— -999
        public extern static void bcd_2_ushort_ex6(UInt16[] pwValues, UInt32 Amount, int InBytechange, int OutBytechange);//16位數據 ——Word

        [DllImport("Prodave6.dll")]//把BCD碼的數組傳換成二進制數組 ——32位數據
        //參數:要處理的數組,要處理的字節數,轉換前是否先交換高低字節,轉換後是否要交換高 低字節
        //InBytechange為1則轉換BCD碼之前,先交換高低字節
        //OutBytechange為1則轉換BCD碼 之後,再交換高低字節
        //如果InBytechange和OutBytechange都沒有置1,則不發生高低位的交換
        //32位數據BCD碼值的許可范圍是:+9 999 999 —— -9 999 999
        public extern static void bcd_2_ulong_ex6(UInt32[] pdwValues, UInt32 Amount, int InBytechange, int OutBytechange);//32位數據——DWord

        [DllImport("Prodave6.dll")]//查看64個連接中哪些被占用,哪些已經建立
        //參 數:傳輸緩沖的字節長度,64位長度的數組(0或1)
        public extern static void GetLoadedConnections_ex6(UInt32 BufLen, int[] pBuffer);

        #endregion

        #region 自定義輔助函數

         public  static UInt16 bytes_2_word(byte dbb0, byte dbb1)//將高低2個byte轉換成1個Word
        {
            UInt16 dbw0;
            dbw0 = (UInt16)(dbb0 * 256 + dbb1);
             return dbw0;
        }

        public static UInt32 bytes_2_dword(byte dbb0, byte dbb1, byte dbb2, byte dbb3)//將高低4個byte轉換成1個dWord
        {
            UInt32 dbd0;
             dbd0 = (UInt32)(dbb0 *16777216 + dbb1 * 65536 + dbb2 * 256 + dbb3);
            return dbd0;
        }

        public static UInt32 words_2_dword(UInt16 dbw0, UInt16 dbw2)//將高低2個word轉換 成1個dWord
        {
            UInt32 dbd0;
            dbd0 = (UInt32)(dbw0 * 65536 + dbw2);
            return dbd0;
        }

        public static byte[] word_2_bytes(UInt16 dbw0)//將Word拆分為2個bytE
        {
            byte[] bytes = new byte [2];
            bytes[0] = (byte)(dbw0 / 256);
            bytes[1] = (byte)(dbw0 % 256);
            return bytes;
        }

        public static byte[] dword_2_bytes (UInt32 dbd0)//將dWord拆分為4個bytE
        {
            byte[] bytes = new byte[4];
             bytes[0] = (byte)(dbd0 / 16777216);
            dbd0 = dbd0 % 16777216;
             bytes[1] = (byte)(dbd0 / 65536);
            dbd0 = dbd0 % 65536;
            bytes [2] = (byte)(dbd0 / 256);
            bytes[3] = (byte)(dbd0 % 256);
            return bytes;
        }

        public static UInt16[] dword_2_words(UInt32 dbd0)//將dword拆分為2個 Word
        {
            UInt16[] Words = new UInt16[2];
            Words[0] = (UInt16)(dbd0 / 65536);
            Words[1] = (UInt16)(dbd0 % 65536);
            return Words;
        }

        #endregion

    }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved