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

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

編輯:關於C#

嚴格意義上講,此文不算OPC的范疇。起因是,另一個項目的PLC強人說,OPC慢,用prodave吧,好,用就用吧,裝好Prodave看是看其英文 資料,雖然英文不好,但好在這裡英文很簡單。好了,上網查了點資料,這裡還要感謝幾個朋友的幫忙,讓我對於C#與C++的數據結構有了更進 一步的認識,也學會了使用DllImport在本文的開頭,我要說明下,Prodave是西門子的通信方式,即使我提供了Prodave6.dll,您不注冊也是 沒用用的,所以請使用西門子的安裝程序,哪裡下載?自己百度一下。不要來問我哪裡下載Prodave6.dll,也不要問我為什麼程序會報錯說沒 有注冊dll

下面開始進入正文。

(1)上來第一個函數,就是連接PLC的LoadConnection_ex6,在說明書裡描述如下:

LoadConnection_ex6
The basic LoadConnection_ex6 function initializes the adapter, checks if thE
driver is loaded, initializes the addresses that have been assigned parameters and
activates the selected interface.
LoadConnection_ex6 is used to set up a transport connection via MPI/PB- or IP
addresses (TCP/IP protocol)
int LoadConnection_ex6 (int ConNr, char* pAccessPoint, int ConTableLen,
CON_TABLE_TYPE * pConTable);
Parameters
ConNr
[in] Number of the connection (max. 64 connections).
pAccessPoint
[in] access point (zero-terminated) of the driver used, e.g. "S7ONLINE" for the MPI
driver or 0 (default).
ConTableLen
[in] length of the table of connections provided by the user in bytes
pConTablE
[in] pointer to address list of connected users; ‘Adr ==0’ is taken as the end mark of
the list.
#pragma pack(1)
typedef union {
unsigned char Mpi; // MPI/PB station address (2)
unsigned char Ip[4]; // IP address (192.168.0.1)
unsigned char Mac[6]; // MAC address (08-00-06-01-AA-BB)
} CON_ADR_TYPE;
typedef struct {
CON_ADR_TYPE Adr; // connection address
unsigned char AdrType; // Type of address: MPI/PB (1), IP (2), MAC (3)
unsigned char SlotNr; // Slot number
unsigned char RackNr; // Rack number
} CON_TABLE_TYPE;
#pragma pack(1)

好吧,起先其他的轉換網上都有 ,不難,但是出現了union共用體,恩C#沒有這個概念。怎麼辦?起先,參考網上的資料,采用

[StructLayout (LayoutKind.Explicit)]
struct S1
{
[FieldOffset(0)]
int a;
[FieldOffset(0)]
int b;
}

類似這樣的布局,再加上類似[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]的聲明。

但是,最終單純 的使用2個數組作為“共用體”字段的話是可以通過編譯的,但是再加上unsigned char Mpi的話,OK你是過不了編譯的,就算過了 運行也出錯。反復嘗試還是失敗,最後我聯想到在內存中實際上這個共用體用的是一個以最大字段為空間大小的內存,於是乎嘗試了,直接定 義[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]byteMac[6],果然解決了,共用體的問題,其實C++傳進去的參數也其實是6字節 的數組而已,進而想既然一個數組搞定,那麼還用共用體干嘛,不要了,於是出現了如下函數轉換的正解:

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
        }
[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);

(2)關於unsigned char * pBuffer, 這個unsigned char *其實有2個轉換可選,有時可以使用byte[],有時則是StringBuilder,這就要集體問題具體分析了。例 如:

int GetErrorMessage_ex6 (int ErrorNr, unsigned long BufLen, unsigned char* pBuffer);
void copy_buffer_ex6 (unsigned char * pTargetBuffer, unsigned char *pSourceBuffer, unsigned long Amount);

前者就轉換 成StringBuilder後者是byte[]。

(3)有些變量雖是整型但是可以用枚舉,而且用枚舉感覺更合適

例如

int db_read_ex6 (unsigned short BlkNr, unsigned char DatType, unsigned
short StartNr, unsigned long * pAmount, unsigned long BufLen, unsigned
char * pReadBuffer, unsigned long * pDatLen)中,unsigned char DatType其實指的是“0x02 = BYTE, 0x04 = WORD, 0x06 = DWORD default: DatType = 0x02”等數據類型
,因此可以翻譯成
public enum DatType : byte//PLC數據 類型
        {
            BYTE = 0x02,
            WORD = 0x04,
             DWORD = 0x06,
        }

(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

    }

(5)以下是測試的代碼:

            //以下測試LoadConnection_ex6
            short ConNr= 63; // First connection;(0 ... 63);(max. 64 connections).
            string AccessPoint = "S7ONLINE"; // Default access point——S7ONLINE
            Prodave6_CS.Prodave6.CON_TABLE_TYPE ConTable ;// Connection tablE
            int ConTableLen = System.Runtime.InteropServices.Marshal.SizeOf(typeof (Prodave6_CS.Prodave6.CON_TABLE_TYPE)) ;// Length of the connection tablE
            int RetValue;
             ConTable.Adr=new byte[]{192,168,1,200,0,0};
            ConTable.AdrType = 2; // Type of address: MPI/PB (1), IP (2), MAC (3)
            ConTable.SlotNr = 2; // 插槽號
            ConTable.RackNr = 0; // 機架號
            RetValue = Prodave6.LoadConnection_ex6(ConNr, AccessPoint, ConTableLen,ref ConTable);

            //以下測試SetActiveConnection_ex6
            UInt16 UConNr = (UInt16)ConNr;
            RetValue = Prodave6.SetActiveConnection_ex6(UConNr);

             //以下測試db_write_ex6
            UInt16 BlkNr = 4;//data block號
             Prodave6.DatType DType = Prodave6.DatType.BYTE;//要讀取的數據類型
            UInt16 StartNr = 0;//起 始地址號
            UInt32 pAmount = 20;//需要讀取類型的數量
            UInt32 BufLen = 20;//緩沖區長度(字節為單位)
            //參數:data block號、要寫入的數據類型、起始地址號、需要寫入類型的 數量、緩沖區長度(字節為單位)、緩沖區
            byte[] pWriteBuffer = new byte[20];
             for (int i = 0; i < pWriteBuffer.Length; i++)
                pWriteBuffer[i] = (byte)(i+1);
                RetValue = Prodave6.db_write_ex6(BlkNr, DType, StartNr, ref pAmount, BufLen, pWriteBuffer);
            //以下測試db_read_ex6
            //參數:data block號、要讀取的數 據類型、起始地址號、需要讀取類型的數量、緩沖區長度(字節為單位)、
            //緩沖區、緩沖區數據交互的長度
            byte[] pReadBuffer = new byte[20];
            UInt32 pDatLen = 0;
             RetValue = Prodave6.db_read_ex6(BlkNr, DType, StartNr, ref pAmount, BufLen, pReadBuffer, ref  pDatLen);

            //以下測試field_read_ex6(測試DB區)
            //參數:data block號、要讀取 的數據類型、起始地址號、需要讀取類型的數量、緩沖區長度(字節為單位)、
            //緩沖區、緩沖區數據交互的 長度
            Prodave6.FieldType FType = Prodave6.FieldType.D;
            for (int i = 0; i < pWriteBuffer.Length; i++)
                pWriteBuffer[i] = (byte)(i);
            RetValue = Prodave6.field_write_ex6(FType, BlkNr, StartNr, pAmount, BufLen, pWriteBuffer);

            //以下測試field_read_ex6(測試DB區)
            //參數:data block號、要讀取的數據類型、起始地址號、需要讀取 類型的數量、緩沖區長度(字節為單位)、
            //緩沖區、緩沖區數據交互的長度
            byte[] pReadBuffer2 = new byte[20];
            RetValue = Prodave6.field_read_ex6(FType, BlkNr, StartNr, pAmount, BufLen,pReadBuffer2, ref pDatLen);


            //以下測試field_read_ex6(測試M區)
            //參數:data block號、要讀取的數據類型、起始地址號、需要讀取類型的數量、緩沖區長度(字節為單位)、
            //緩沖區、緩沖區數據交互的長度
            Prodave6.FieldType FTypeM = Prodave6.FieldType.M;
            byte []pWriteBufferM = {2};
            RetValue = Prodave6.field_write_ex6(FTypeM, 0, 100, 1, 1, pWriteBufferM);

            //以下測試field_read_ex6(測 試M區)
            //參數:data block號、要讀取的數據類型、起始地址號、需要讀取類型的數量、緩沖區長度(字節 為單位)、
            //緩沖區、緩沖區數據交互的長度
            byte[] pReadBufferM2 = new byte[1];
            RetValue = Prodave6.field_read_ex6(FTypeM, 0, 100, 1, 1, pReadBufferM2, ref pDatLen);

            //以下測試mb_setbit_ex6
            UInt16 MbNr = 100;//mb block號
             UInt16 BitNr = 0;//位號
            byte Value = 1;//0、1
            RetValue = Prodave6.mb_setbit_ex6(MbNr,BitNr, Value);

            //以下測試mb_bittset_ex6(測試DB區)
            int pValue = 0;
            RetValue = Prodave6.mb_bittest_ex6(MbNr, BitNr, ref pValue);


            //以下測試GetLoadedConnections_ex6
            BufLen = 64;
            int[] pBufferI = new int[64];
            Prodave6.GetLoadedConnections_ex6 (BufLen, pBufferI);

            //以下測試UnloadConnection_ex6
            RetValue = Prodave6.UnloadConnection_ex6(UConNr);

            //以下測試GetErrorMessage_ex6
             int ErrorNr = 0x7040; // Block boundary exceeded, correct the number
            StringBuilder Buffer = new StringBuilder(300); // Transfer buffer for error text
            BufLen = (UInt32)Buffer.Capacity; // Buffer length    
            RetValue = Prodave6.GetErrorMessage_ex6(ErrorNr, BufLen, Buffer);

            //以下測試float_2_gp_ex6
            float ieee = 1.2F;
            UInt32 gp=0;
            float pieee=0;
            RetValue = Prodave6.float_2_gp_ex6(ieee, ref gp);
            RetValue = Prodave6.gp_2_float_ex6(gp,ref pieee);

            //以 下測試gp_2_float_ex6
            RetValue = Prodave6.testbit_ex6(7, 0);
            RetValue = Prodave6.testbit_ex6(7, 1);
            RetValue = Prodave6.testbit_ex6(7, 2);
            RetValue = Prodave6.testbit_ex6(7, 3);
            RetValue = Prodave6.testbit_ex6(7, 4);
             RetValue = Prodave6.testbit_ex6(7, 5);
            RetValue = Prodave6.testbit_ex6(7, 6);
             RetValue = Prodave6.testbit_ex6(7, 7);

            //以下測試byte_2_bool_ex6
             int [] boolValue=new int[8];
            Prodave6.byte_2_bool_ex6(255, boolValue);

            //以下測試bool_2_byte_ex6
            byte  byteValue;
             byteValue=Prodave6.bool_2_byte_ex6(boolValue);

            //以下測試kf_2_integer_ex6和 kf_2_long_ex6
            UInt16 u16=25600;UInt16 u16_;
            u16_=Prodave6.kf_2_integer_ex6(u16);
            UInt32 u32 = 1677721600; UInt32 u32_;
             u32_=Prodave6.kf_2_long_ex6(u32);

            //以下測試swab_buffer_ex6(byte[] pBuffer, UInt32 Amount)
            byte[] pBuffer=new byte[11];
            UInt32 Amount=(UInt32) pBuffer.Length;
            for (int i = 0; i < Amount; i++)
                pBuffer [i] = (byte)(i+1);
            Prodave6.swab_buffer_ex6(pBuffer, 6);

            //以下 測試copy_buffer_ex6
            byte[] pSourceBuffer={1,2,3,4,5,6,7,8,9,10};
            byte[] pTargetBuffer=new byte[10];
            Prodave6.copy_buffer_ex6( pTargetBuffer,  pSourceBuffer,8);

            //以下測試ushort_2_bcd_ex6
            UInt16[] pwValues = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
            Prodave6.ushort_2_bcd_ex6(pwValues, 10, 0, 0);

            //以下測試bcd_2_ushort_ex6
            Prodave6.bcd_2_ushort_ex6(pwValues, 10, 0, 0);

            UInt32[] pdwValues = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
             //以下測試ulong_2_bcd_ex6
            Prodave6.ulong_2_bcd_ex6(pdwValues,8, 0, 0);

             //以下測試bcd_2_ulong_ex6
            Prodave6.bcd_2_ulong_ex6(pdwValues, 8, 0, 0);

(6)最後,要說的是我沒有轉換全部的函數,只是挑了我認為比較常用的,或者我可能用的到的進行了轉換。

詳細 的程序包,如果能要的話,可以去這裡下載,同時還附帶了英文版的prodave的pdf說明書哦:

http://download.csdn.net/source/1408924

如果只是要單獨下載電子書的話,請看這裡:

http://download.csdn.net/source/1408940

注意:開發環境為VS2008SP1,而其是控制台程序,沒有輸出,想看時如何測試各 個函數的,請自行斷點跟蹤,程序是我測試過的,不存在錯誤,除非您該我代碼。當然,您得在PLC的地址中開放必要的地址以供測試。

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