Fanuc Focas1/2 in VS2013C# 學習筆記
C++的話是沒什麼太大的問題,就看電子書FWLIB32.HTM就行了,那…我們開始吧!
環境:
Win7 64位元、
Visual Studio 2013、
Fanuc Focas2 Ver4.7、
NCGuide Series 0i-F
1.建立專案
2.簡單拉幾個元件
3.設定屬性
4.將Fanuc Focas1/2 library加入
好啦,到這邊,我們把fwlib32.cs開起來看看,要怎麼使用?
看起來沒有namespace,但有個Focas1的class,好啦!要怎麼連線呢?
我們看一下電子書,開啟FOCAS2 Ver 4.7\Document\SpecE\FWLIB32.HTM
就這樣,知道用誰連線了,但很不幸的是,電子書都是寫給C/C++的!
所以我們又要回到fwlib32.cs,搜尋cnc_allclibhndl3
瞧!找到它的引數要哪些了,但…第一個引數是什麼鬼,怎麼這麼長,在C++中…只不過是個不定長度的char指標…,別被它嚇到了。既然它是AsAny的型態,那先丟給它字串看看它吃不吃。
看來第一個引數很賞臉的吃了字串,沒有顯示任何錯誤。再來判斷連線狀態吧!
看來它不像C++一樣能#define 變數,那來找找在哪裡?
在class Focas1 中就有宣告了,既然是Focas1,使用上當然不能只是EW_OK。
好啦!它接受了!把程式碼完成吧。
5.連線
看來是成功了,這邊要講解一下,NCGuide預設的IP是127.0.0.1、Port是8193,無論你NCGuide裡面設定什麼IP、Port,你真的用那個連,也連不上。
比較好奇的是…DLL,眼尖的人一定發現了,微軟有這麼聰明嗎?知道我函式庫放在哪裡?
於是我搜尋了一下Windows資料夾
果然是有鬼,不知道什麼時後偷放的。還是安裝NCGuide的時後放的?
我的問卷調查
相關文章:

3您好。可以請問您Fanuc Focas2 Ver4.7、 NCGuide Series 0i-F是去那裡下載的嗎?
是由台灣Fanuc 所提供,我來到這間公司的時候就有購買且安裝好了,軟體需要USB Key 才能使用
了解了。謝謝你
想請版主有與CNC做傳接ˋ值的範例嗎? 或是使用的方法?
Macro 部分? PMC部分? 都有,待我整理一下。
好的-在麻煩您 如有其他相關參考資料也可以提供出來 沒關係~~
是只有看Focas 的 Document,但Fanuc提供的是C/C++範例,而且是直接寫在 Document中,所以需要花一點時間在轉C#,只能用Try的
那如果是要讀取CNC 機台相關的資訊 因該使用哪些類別 比如cnc_rdmacro
類別? 如果是機台相關資訊會使用: cnc_sysinfo cnc_sysinfo_ex cnc_statinfo cnc_statinfo2 ...等函式 cnc_rdmacro 是讀取巨集變數,主要是用在加工程式、畫面 有些機台資訊你可能在cnc_rdparam可以讀到。
可以詢問一下有關 Macro 部分 與 PMC部分 有什麼差別嗎?
Macro(巨集)變數,是用在加工程式,或者畫面上。 PMC(Ladder)暫存器,習慣上可能會稱為PLC程式,寫動作或IO上使用。
那系統變數可以使用在哪些函式 系統變數: https://www.pixpo.net/game/0IX4FtaF.html 如果要抓取 機台所輸入的程式 因該使用哪個函式?
你所提到的網頁中 有些是Macro變數、有些是系統參數 Macro變數主要是使用 cnc_rdmacro cnc_wrmacro cnc_rdmacror cnc_wrmacror cnc_rdmacror2 cnc_wrmacror2 cnc_rdpmacro cnc_wrpmacro cnc_rdpmacror cnc_wrpmacror cnc_rdpmacror2 cnc_wrpmacror2 系統參數主要是使用 cnc_rdparam cnc_wrparam
可以在請問一下 同一個變數 在各個不同函式 所抓的內容 會有不同嗎 ? Macro 是根據你下的變數所抓不同的資料嗎?
同一個Macro變數,有些函式限制範圍,有些函式取出格式是double,有些函式取出格式是整數與小數位。有些Macro有分共用與非共用,非共用就各區使用各區的Macro
在請問一下 使用 Focas1.cnc_rdzofs 出現錯誤2 是倒數第2個變數長度設錯嗎? 那因該設多少? Focas1.IODBZOFS result = new Focas1.IODBZOFS(); short r1 = Focas1.cnc_rdzofs(FFlibHnd1,0, -1, 5, result); if (r1 == Focas1.EW_OK) { //成功 short datano = result.datano; short type = result.type; //long data_value = result.data[0]; MessageBox.Show(datano + " " + type + " " ); } else { //失敗 MessageBox.Show(r1.ToString()); }
錯誤2表示:你長度給錯了 依照說明,長度要給結構大小, N軸大小 = 4 + 4 * N 1軸 = 4 + 4 * 1 = 8 2軸 = 4 + 4 * 2 = 12 ... 看你這台控制器設定多少軸數 問超過就會回錯誤 之後盡量不要用-1下全軸,遇到錯誤的機率極高 用多少給多少
Macro有分區域的話 哪些函式使用哪些Macro的變數?
函式的說明開頭會描述使用範圍
想請問您函式庫 是看官網的嗎? 官網: https://www.inventcom.net/fanuc-focas-library/ncdata/cnc_rdzofsr
不是,我是看離線版的 但內容是一模一樣 離線版或許是從Focas Library CD 來的
所以在 FANUC 上的函式 都是有串連在一起的 比如說某個函式 輸出的值 會是另一個函式所輸入的值 因為我還不是很懂 像函數裡 例如: cnc_rdparam3(unsigned short FlibHndl, short number, short axis, short length, short absolute, IODBPSD *param); 總共要篩6個變數 可是又不確定到底要篩什麼值? 請問你都怎麼去篩函式裡的值呢?
要學著去看說明,有的最下面會有範例,有C\C++底子的人比較吃香,去了解硬體與軟體架構,再加上官方的文件說明,八成九成都知道怎麼使用,剩下就是實驗精神,像你舉例的這個函式,看名稱就知道是為了讀系統參數所設計,還是改良版的第三版,第一個引數是必需知道的,就知道你有沒有看前面官方寫的說明文章,第二個引數也猜得出來是要填參數號,然後也猜得到第三個引數是要填軸號,有些參數會分軸,有些不會,再來就是結構的長度,發那科很喜歡這種設計模式,第五個就要查說明了,最後就是丟結構進去取出資料
如果要取得公司CNC機台的 加工程序(歷程)、機器狀態、產量等 因該使用哪一些函式?
目前加工的程式 cnc_rdprgnum 目前的N cnc_rdseqnum 系統資訊 cnc_sysinfo cnc_sysinfo_ex 系統狀態 cnc_statinfo cnc_statinfo2 參數 cnc_rdparam (產量、CycleTime...等,請查手冊)
請問你那邊有參數表 跟變數表嗎?
請依照CNC型號查參數說明書,我也只看電子書查我要的功能。
EW_VERSION (-7) Version mismatch between the CNC/PMC and library The CNC/PMC version does not match that of the library. Replace the library or the CNC/PMC control software 如果出現-7錯誤 是代表 機台要做更新嗎?
沒遇過,看看CNC型號與函式是否支援此型號,是Ethernet 的還是 HSSB的,又或者是看看有沒有其他替代函式。
想請問你那有 C# (1)系統資訊 cnc_sysinfo cnc_sysinfo_ex (2)系統狀態 cnc_statinfo cnc_statinfo2 的範例嗎?
最近很忙 在這簡單說明 short ret; Focas1.ODBSYSEX FSystemInfoEx=new Focas1.ODBSYSEX(); ret = Focas1.cnc_sysinfo_ex(FFlibHndl, FSystemInfoEx); if (ret == Focas1.EW_OK) { //... } Focas1.ODBSYS FSystemInfo = new Focas1.ODBSYS(); ret = Focas1.cnc_sysinfo(FFlibHndl, FSystemInfo); if (ret == Focas1.EW_OK) { //... } Focas1.ODBST FStatusInfo = new Focas1.ODBST(); ret=Focas1.cnc_statinfo(FFlibHndl, FStatusInfo); if (ret == Focas1.EW_OK) { //... } Fanuc 提供的 fwlib32.cs中 我並沒有發現cnc_statinfo2 但fwlib32.h中有 但你可以照它載入DLL的方式補上去,建立結構,一樣可以用
嗨~親愛的部落客與同好夥伴們,看到大家在部落格中互動留言,真是太開心啦~ 痞客邦有個追新留言小祕技tip要偷偷告訴你喲! 只要運用簡單的小撇步,在喜愛的部落格文章中,按下【+關注】按鈕,就能在自己的興趣牆上快速追蹤各種最新動態,即時和部落客與同好夥伴們留言互動,還能探索發掘更多你可能喜歡的興趣社群新鮮事喔! >>去看看怎麼運用【+關注】https://goo.gl/xfxB4o 也歡迎大家多多關注痞客邦官方帳號,獲得更多新消息! >>去關注【痞客邦】https://goo.gl/2sEzuL >>去關注【PIXstyleMe】https://goo.gl/PBGd69
請問你有使用過focas有關sampling的函式嗎?我是用c#作開發,呼叫cnc_sdtsetchnl和cnc_sdtstartsmpl都成功,但執行到cnc_sdtreadsmpl時卻說"記憶體毀損",我的程式如下,執行到最後一行會有問題: short ret, stat; Focas1.ODBSD da = new Focas1.ODBSD(); da.chadata = new IntPtr(); da.count = new IntPtr(); ret = Focas1.cnc_sdtreadsmpl(FlibHndl, out stat, 1000, da);
抱歉,我沒有使用過sampling,記憶體毀損可能是因為記憶體配置錯誤,你new IntPtr()...可能不是這麼使用的,你試試 da.chadata = Marshal.AllocHGlobal(size1); da.count = Marshal.AllocHGlobal(size2); 比較要注意的是,記憶體配置是以byte下去算 Read的引數:datanum 的限制 AllocHGlobal 是需要 FreeHGlobal(IntPtr) 來釋放記憶體的
您好,我是上一篇的發問者,感謝你的回答,不好意思另外有幾點想問: 1. da.chadata = Marshal.AllocHGlobal(size1); size1要怎麼下? 2. 因為記憶體配置以byte去算,所以Read引數datanum都是8的倍數? 3. 在AllocHGlobal之前,要先宣告一個IntPtr,然後 FreeHGlobal(IntPtr)? 4. 請問你有用過cnc_rdsyshard這函式嗎?我之前在Fanuc 30i一直呼叫失敗,讀不到 硬體資料
byte = 1 Byte short = 2 Byte int = 4 Byte long = 4 Byte 假設變數是short,陣列大小1000 記憶體配置 Marshal.AllocHGlobal(2*1000) 如果不知道是幾Byte, 就 Marshal.AllocHGlobal(sizeof(short)*1000) EX: da.chadata = Marshal.AllocHGlobal(sizeof(short)*1000); //...Coding Read here... FreeHGlobal(da.chadata); 引數datanum 與 Byte 應該是沒有關聯的 GOOGLE 翻譯一下, Specify the number of sampling data which you want to read. (Specify the value of eight or more.) 指定你想要讀取的數個取樣資料 (指定8個或更多的) Reading process is executed every 8WORD unit. So, specify the multiple of eight as much as possible for this value. 程序每次執行讀取以8 WORD 為單位。所以盡可能的指定8的倍數。 只是它沒說一個取樣點多大, 只能從結構中了解 typedef struct odbsd { unsigned short *chadata; /* Pointer to sampling data */ long *count; /* Pointer to reading number */ } ODBSD; 推測一個取樣點就是一個unsigned short = WORD = 2Byte 假設你今天要讀取100個取樣點, 你就要配置104個WORD(13 x 8)的記憶體 = 208 Byte 至於da.count 應該只要配至 4Byte 的記憶體給它 但如果是固定的又為何要用IntPtr,就覺得有陷阱, 就要你自己去Try看看了。 看結果怎麼樣,就看你要不要分享這份技術讓我知道了。 不然我也不知道Sampling 是甚麼, 是電壓?電流?負載?訊號?轉速?位置? 前置作業有哪些?要設定甚麼?單位是甚麼? cnc_rdsyshard 啊...我有玩過, 有的機台有讀出來,有的機台沒有讀出來。 沒讀出來的我並沒有理會它。頂多手動操作機台用CF卡讀回來。 我這邊都是0i-F的
你好,我最近使用 cnc_wrmdiprog這個函式去寫 因為我也是用C#寫 ,所以傳ref char過去,但一直都只會寫入第一個字 所以我才改用指標給他,但結果一樣也只能夠傳第一個字, 說明檔也只是寫引數要給top address,我認為應該是給了第一個位址後 他就要自動依照我的位址跟長度去一個一個字寫入才對,但都不從我願.... 我也有嘗試過配合dwnStart跟迴圈去寫,但都一樣只會有一個字元過去 簡易程式碼如下: unsafe { try { string s = "Mˊ6T"; fixed (char* ptr = s) { short _length = (short)s.Length; short mdi_ret = Focas1.cnc_wrmdiprog(cncHandle,_length,*ptr); if (mdi_ret == (short)Focas1.focas_ret.EW_BUFFER) { SituationBox.Text = "mdi_ret狀態:Buffer"; } if (mdi_ret == (short)Focas1.focas_ret.EW_OK) { SituationBox.Text = "mdi_ret狀態:OK"; } if (mdi_ret != (short)Focas1.focas_ret.EW_OK) { SituationBox.Text = "錯誤,mdi_ret錯誤代碼:" + mdi_ret; } } } catch { SituationBox.Text = "Catch錯誤"; Focas1.cnc_freelibhndl(cncHandle); } }
我沒有用這麼複雜的方式 public void WriteMdiProg(String prog) { //Windows 換行是\r\n Fanuc EOB是\n (畫面顯示;) prog = prog.Replace("\r\n", "\n"); short ret; ret = Focas1.cnc_wrmdiprog(FFlibHndl, (short)prog.Length, prog); if (ret == Focas1.EW_OK) { Console.WriteLine("Write MDI Success"); } else { Console.WriteLine("Write MDI Fail."); } }
你好請問有相關的討論區嗎
可以到fanuc論壇討論
你好 有去看過台灣的論壇似乎沒有在用 有建議的嗎
呵呵,也是啦,我也是直接問fanuc,直接發mail給他們,然後打電話給他們
你好 請問如果是用網路連線是連上就行嗎? 還是要設定其他東西
是的,除非沒有開Option,現在0i-F 之後都標配Focus,應該能直接連,設定好Ip跟port就好了。
*****
*****
*****
你好 請問讀取機台加工數量的指令是什麼!?
cnc_rdparam 參數6711 參數說明書(B-6410CM_01.PDF)
版主你好: 請問一下使用cnc_allclibhndl拿了一次的out 變數後 中間我沒有再使用過cnc_allclibhndl要handle了 那過一段時間一定要執行一次cnc_freelibhndl嗎?
我沒有在釋放的,除非我要離線(程式沒關閉),或是程式關閉
*****
*****
你好 想請問fwlib32.cs是跟發那科索取的嗎? 還是可以從官網下載?
請問一下我的系統內有FWLIB64.dll這個檔案了 可是還是顯示unable to load DLL'FWLIB64.dll' or one of its dependencies:找不到指定的模組 要如何解決
我沒有遇過這樣的問題 看看你專案是不是設定CPU 64位元 將FWLIB64.dll 複製到執行檔路徑下