強實時運動控制內(nèi)核MotionRT750
MotionRT750是正運動技術(shù)首家自主自研的x86架構(gòu)Windows系統(tǒng)或Linux系統(tǒng)下獨占確定CPU的強實時運動控制內(nèi)核。

該方案采用獨占確定CPU內(nèi)核技術(shù)實現(xiàn)超強性能的強實時運動控制。它將核心的運動控制、機器人算法、數(shù)控(CNC)及機器視覺等強實時的任務(wù),集中運行在1-2個專用CPU核上。與此同時,其余CPU核則專注于處理Windows/Linux相關(guān)的非實時任務(wù)。
此外集成MotionRT750 Runtime實時層與操作系統(tǒng)非實時層,并利用高速共享內(nèi)存進行數(shù)據(jù)交互,顯著提升了運動控制與上層應(yīng)用間的通信效率及函數(shù)執(zhí)行速度,最終實現(xiàn)更穩(wěn)定、更高效的智能裝備控制,確保了運動控制任務(wù)的絕對實時性與系統(tǒng)穩(wěn)定性,特別適用于半導(dǎo)體、電子裝備等高速高精的應(yīng)用場合。

MotionRT750應(yīng)用優(yōu)勢:
1.跨平臺兼容性:支持Windows/Linux系統(tǒng),適配不同等級CPU。
2.開發(fā)靈活性:提供多語言編程接口,便于二次開發(fā)與功能定制。
3.實時性提升:通過CPU內(nèi)核獨占機制與高效LOCAL接口,實現(xiàn)2-3us指令交互周期,較傳統(tǒng)PCI/PCIe方案提速近20倍。
4.擴展能力強化:多卡多EtherCAT通道架構(gòu)支持254軸運動控制及500usEtherCAT周期。
5.系統(tǒng)穩(wěn)定性:32軸125us EtherCAT冗余架構(gòu)消除單點故障風(fēng)險,保障連續(xù)生產(chǎn)。
6.安全可靠性:不懼Windows系統(tǒng)崩潰影響,藍屏?xí)r仍可維持急停與安全停機功能有效,確保產(chǎn)線安全運行。
7.功能擴展性:實時內(nèi)核支持C語言程序開發(fā),方便功能拓展與實時代碼提升效率。
MotionRT750視頻介紹可點擊→正運動強實時運動控制內(nèi)核MotionRT750。
更多關(guān)于MotionRT750的詳情介紹與使用點擊→強實時運動控制內(nèi)核MotionRT750(一):驅(qū)動安裝、內(nèi)核配置與使用。
超實時EtherCAT運動控制卡XPCIE6032H
XPCIE6032H運動控制卡集成6路獨立EtherCAT主站接口。整卡最高可支持254軸運動控制;125usEtherCAT通訊周期時,兩個端口配置冗余最高可支持32軸運動控制。6個EtherCAT主站各通道獨立工作,多EtherCAT主站互不影響。



XPCIE6032H視頻介紹可點擊→全球首創(chuàng)!PCIe 6路高性能EtherCAT運動控制卡XPCIE6032H。
XPCIE6032H運動控制卡面向半導(dǎo)體設(shè)備、精密3C電子、生物醫(yī)療儀器、新能源裝備、人形機器人及激光加工等高速高精場景,為固晶機、貼片機、分選機、鋰電切疊一體機、高速異形插件設(shè)備等自動化裝備提供核心運動控制支持。
XPCIE6032H硬件特性:
1.EtherCAT通訊周期可到125us(需要主機性能與實時性足夠)。
2.板卡集成6路獨立的EtherCAT主站接口,最多可支持254軸運動控制。
3.搭載運動控制實時內(nèi)核MotionRT750。
4.相較于傳統(tǒng)的PCI/PCIe、網(wǎng)口等通訊方式,速度可提升10-100倍以上。
5.板載16路高速輸入,16路高速輸出。
6.板載4路高速鎖存,4路通用PWM輸出。
更多關(guān)于XPCIE6032H的詳情介紹與使用點擊→全球首創(chuàng)!PCIe超實時6通道EtherCAT運動控制卡上市!。
超實時EtherCAT運動控制卡XPCIE2032H
XPCIE2032H集成2路獨立EtherCAT接口。整卡最高可支持至254軸運動控制;125usEtherCAT通訊周期時,單接口最高可支持32軸運動控制。2個EtherCAT主站各通道獨立工作,多EtherCAT主站互不影響。

雙EtherCAT主站端口可任意設(shè)置為以下通道,且兩個端口也設(shè)置為不同類型通道:
● 高速通道-EtherCAT通訊周期125us
● 常規(guī)通道-EtherCAT通訊周期250us-8ms


XPCIE2032H視頻介紹可點擊→高速高精運動控制!PCIe超實時2通道EtherCAT運動控制卡上市!。
XPCIE2032H硬件特性:
1.EtherCAT通訊周期可到125us(需要主機性能與實時性足夠)。
2.板卡集成2路獨立的EtherCAT主站接口,最多可支持254軸運動控制。
3.搭載運動控制實時內(nèi)核MotionRT750。
4.相較于傳統(tǒng)的PCI/PCIe、網(wǎng)口等通訊方式,速度可提升10-100倍以上。
5.板載8路高速輸入,16路高速輸出。
6.板載4路高速鎖存,4路通用PWM輸出。
更多關(guān)于XPCIE2032H的詳情介紹與使用點擊→高速高精運動控制!PCIe超實時2通道EtherCAT運動控制卡上市!。
PCIe EtherCAT實時運動控制卡XPCIE1032H
XPCIE1032H是一款基于PCI Express的EtherCAT總線運動控制卡,可選6-64軸運動控制,支持多路高速數(shù)字輸入輸出,可輕松實現(xiàn)多軸同步控制和高速數(shù)據(jù)傳輸。


XPCIE1032H視頻介紹可點擊→高性能PCIe EtherCAT運動控制卡 | XPCIE1032H_。
XPCIE1032H運動控制卡集成了強大的運動控制功能,結(jié)合MotionRT7運動控制實時軟核,解決了高速高精應(yīng)用中,PC Windows開發(fā)的非實時痛點,指令交互速度比傳統(tǒng)的PCI/PCIe快10倍。

XPCIE1032H硬件特性:
1.6-64軸EtherCAT總線+脈沖可選,其中4路單端500KHz脈沖輸出。
2.16軸EtherCAT同步周期500us,支持多卡聯(lián)動。
3.板載16點通用輸入,16點通用輸出,其中8路高速輸入和16路高速輸出。
4.通過EtherCAT總線,可擴展到512個隔離輸入或輸出口。
5.支持PWM輸出、精準輸出、PSO硬件位置比較輸出、視覺飛拍等。
6.支持直線插補、圓弧插補、連續(xù)軌跡加工(速度前瞻)。
7.支持電子凸輪、電子齒輪、位置鎖存、同步跟隨、虛擬軸、螺距補償?shù)裙δ堋?/p>
8.支持30+機械手模型正逆解模型算法,比如SCARA、Delta、UVW、4軸/5軸 RTCP...
更多關(guān)于XPCIE1032H詳情點擊“不止10倍提速!PCIe EtherCAT實時運動控制卡XPCIE1032H 等您評測!”查看。
C#實現(xiàn)CAD解析及如何對小線段軌跡進行運動前瞻
CAD具有繪圖效率高,速度快,精度高,便于交流等優(yōu)點,所以得到了廣泛的應(yīng)用。CAD伴隨著整個PC基礎(chǔ)工業(yè)的突飛猛進,正迅速而深刻地影響著設(shè)計和繪圖的基本方法。
但是在實際應(yīng)用過程中,如果CAD導(dǎo)圖的軌跡是較為復(fù)雜的異形軌跡,那么結(jié)果會導(dǎo)出來大量小線段。這時候要保證機臺加工高效平穩(wěn),需要通過運動前瞻算法對軌跡進行一定程度的平滑,并且在拐彎點合理降速,曲線段整體也要合理降速,保證各分軸速度連續(xù)不出現(xiàn)速度突變。
01 CAD圖紙解析
正運動技術(shù)提供開放的ZmotionCadEx庫,可導(dǎo)入DXF、Ai、Plt、Dst圖紙,可以生成運動坐標數(shù)據(jù)轉(zhuǎn)G代碼、zbasic運動指令,或直接PC函數(shù)執(zhí)行運動。


02 開啟控制器的運動前瞻
之前推文也有介紹過,控制器的運動前瞻主要通過Corner_mode進行設(shè)置。
1.CornerMode功能前瞻設(shè)置說明
第一,它可對指令進行整體規(guī)劃,即對各段速度進行整體規(guī)劃,再配合指令段內(nèi)的加減速控制,可以使機床保持高速運行提高效率,使負載運動更加流暢,告別停停走走,系統(tǒng)通過Merge速度融合功能實現(xiàn)。
第二,它可保證在高速運行的基礎(chǔ)上為了限制機械沖擊和過切等,進行減速識別,通過提前識別軌跡變化,從而按照安全的減速度提前減速,系統(tǒng)通過減速/停止融合功能、抑制沖擊功能實現(xiàn)。
綜上所述,速度前瞻功能既可提升整機效率,也可減少沖擊增加柔性,降低零部件磨損,增加設(shè)備使用壽命。
(1)拐角減速
拐角減速功能解決的問題是:當指令間夾角過大時,如果仍以較大速度運行,會在夾角處產(chǎn)生較大的機械沖擊,軌跡偏離。

控制器會對指令間軌跡變化的夾角進行提前識別,比較其與減速/停止角的大小關(guān)系,提前決定是否進行減速,保證在指令連接處平穩(wěn)過渡。

如圖,OA過渡AB段位置時角度小于減速角度則,S1-S2段不進行減速,AB過渡BC段時角度大于減速角度則進行減速處理過渡過程如S2-S3段,BC過渡CD段角度大于停止角度速度需要降到零如S3-S4段位置處理。執(zhí)行效果如下:
①未開啟拐角減速

②開啟拐角減速
→達到減速角度,未達到停止角度,部分減速。

→達到停止角度,完全減速。

(2)小圓限速
小圓限速功能用于處理,在運行軌跡中可能運行圓弧軌跡擬合成的小圓,由于角度偏轉(zhuǎn)較大導(dǎo)致出現(xiàn)軌跡偏轉(zhuǎn),因此在這種位置需要進行速度限制的處理。開啟小圓限速,小圓半徑超過限速半徑的時候不會對速度限制,小圓半徑小于限速半徑的時候則會開始對速度進行限制。
(3)自動倒角
自動倒角功能一般是用于拐角處按照一定的倒角半徑進行軌跡的弧度化處理,使速度變化更平滑。如圖所示:
①未開啟倒角

②開啟倒角

設(shè)置CORNER_MODE主要用到了下面幾個函數(shù)接口:

①

②

③

④

⑤
2.適用于小線段應(yīng)用的新平滑指令
針對連續(xù)小線段應(yīng)用,可以開啟zsmooth_mode平滑速度曲線模式,效果顯著。
(1)啟用平滑速度曲線模式
zsmooth_start() zsmooth_end()
上述兩個basic指令是用于開啟和關(guān)閉新的平滑模式,這兩個指令都是進入緩沖的,記得一定要調(diào)用zsmooth_end指令,否則可能導(dǎo)致最后幾個小運動段位于等待狀態(tài)。可以提前先調(diào)用一次zsmooth_end,以防上次沒有正常關(guān)閉。
在PC程序里調(diào)用的話可以用Execute函數(shù)發(fā)送字符串,注意,zsmooth_start()是作用于某個軸的,如果前面沒有base指令的話,就要用axis指令指定軸號,用法應(yīng)該是 zsmooth_start() axis(xxx),而不是zsmooth_start(xxx)。下圖execute示例主軸為軸0。


開啟新的平滑模式后,zsmooth的效果就非常強。數(shù)值越大越平滑,但如果小線段點間隔過大,并且zsmooth也很大,可能會造成運動軌跡變形。如果出現(xiàn)變形,要么減小zsmooth,或者減少小線段的間隔。
(2)設(shè)置CORNER_ACCEL

CORNER_ACCEL類似之前的小圓限速,默認值0不生效,設(shè)置數(shù)值后替換FULL_SP_RADIUS。
用于在曲率較大的地方去合理降速。這個拐彎加速度的大致理解為v = sqrt(a * r),這個a就是拐彎加速度。
(3)設(shè)置JERK

JERK用來控制加加速度大小,可以讓合成速度的不平滑處更平滑,也會約束空跑階段的加速度大小。默認值0不生效,設(shè)置值后替換SRAMP。
C#使用ZTrackSmooth庫的連續(xù)平滑函數(shù)
03
在cad導(dǎo)出小線段數(shù)組后,可以通過ZTrackSmooth.dll庫中提供的ZTS_ContinueSmoothAndSpeed函數(shù)進行運動前瞻規(guī)劃,它的作用主要是通過給定參數(shù)用樣條方式去連續(xù)平滑軌跡,并且在拐彎點和曲線段合理降速。

其中pDataPoints是傳入的cad導(dǎo)出的小線段數(shù)組,通過設(shè)定對應(yīng)參數(shù)后會
pSmoothPoints :平滑過后的坐標點集
parryLmtSp:輸出每個店限速(mm/s),對應(yīng)每條線段,用movelimit運行,<=0就不用設(shè)置// parryForceSp:輸出的每段force_speed運行速度
然后根據(jù)輸出結(jié)果按照流程使用對應(yīng)函數(shù)下發(fā)給控制器執(zhí)行。



其它傳參為平滑時候所需要的參數(shù),他們作用如下:
disErr : 參考誤差系數(shù)(設(shè)置越大,拐點處軌跡誤差越大,默認可輸入1)
用來控制高級平滑算法平滑后的軌跡與原軌跡之間最大參考誤差,當此參數(shù)設(shè)置越大,平滑后的軌跡距離原軌跡的最大誤差也越大,同時平滑效果越好,運動時的速度可以達到更快,曲率大的地方過彎速度可以更快,反之則是相反的效果。
同一段軌跡:
·此參數(shù)是設(shè)置為1.0

·此參數(shù)設(shè)3.0

splineDisPrecision :樣條最小線段的參考長度(設(shè)置的越小,樣條拆分越細)默認可輸入0.1
用來平滑高級平滑后的軌跡是原來離散點的參考倍數(shù),默認0.1即可,代表10倍。
此參數(shù)設(shè)置的倍數(shù),平滑后的軌跡越密集,最小設(shè)置為4倍(0.25),最大建議不要設(shè)置超過20(0.05)。
·設(shè)置為4倍:

·設(shè)置為10倍:

plimitR :限速半徑數(shù)組,不同的限速半徑對應(yīng)不同的限速值
plimitRSp : 限速半徑速度數(shù)組,和限速半徑數(shù)組對應(yīng)
limitRCnt: 限速半徑的個數(shù)
用來根據(jù)曲率半徑對應(yīng)的限制速度進行曲線段限速,和控制器底層的小圓限速區(qū)別在于:
小圓限速只需要設(shè)置最大限速半徑,限制速度和最小速度,然后根據(jù)實際圓速度=限制速度*實際半徑/限速最大半徑進行線性限速;
該函數(shù)可以通過設(shè)置分段限速,應(yīng)對上面小圓限速效果不好的時候,更可以根據(jù)實際機臺效果進行設(shè)置,比如設(shè)置限速半徑和對應(yīng)限速值為:

04 控制器速度前瞻和C#連續(xù)平滑函數(shù)共同使用
上面介紹的兩種方式也可以一起使用,效果會更加明顯,下面是一些推薦參數(shù)設(shè)置,可供參考測試:
測試軌跡(導(dǎo)入原始圖形為PLT圖形):

運動前瞻未設(shè)置的速度波形(VP_SPEED為合成速度,MSPEED為各軸分速度):

推薦參數(shù)設(shè)置1
不使用C#平滑函數(shù),使用控制器內(nèi)置的限速和平滑模式,關(guān)閉連續(xù)倒角平滑。
① 前瞻模式corner_mode=2+8+16+32=58
② 減速角度=15
③ 停止限速=45
④ 平滑半徑Zsmooth=2(根據(jù)實際軌跡誤差設(shè)置)
⑤ 連續(xù)倒角平滑zsmooth_start不開啟
⑥ 小圓限速半徑300 (根據(jù)實際機臺效果去設(shè)置)
⑦ 小圓限速最小值50 (根據(jù)實際機臺效果去設(shè)置)


推薦參數(shù)設(shè)置2
不使用C#平滑函數(shù),使用控制器內(nèi)置的限速和平滑模式,關(guān)閉連續(xù)倒角平滑。
① 前瞻模式corner_mode=2+8+16+32=58
② 減速角度=15
③ 停止限速=45
④ 平滑半徑ZSmooth=2(根據(jù)實際軌跡誤差設(shè)置)
⑤ 連續(xù)倒角平滑zsmooth_start開啟
⑥ 各軸的corner_accel設(shè)置合理 例如2000,2000,2000
此參數(shù)設(shè)置之后,替代小圓限速,此參數(shù)設(shè)置越大,拐彎時限速值越高。


推薦參數(shù)設(shè)置3
開啟使用C#平滑函數(shù),并使用控制器內(nèi)置的限速和平滑模式,關(guān)閉連續(xù)倒角平滑。
① 前瞻模式corner_mode=2+8+16+32=58
② 減速角度=15
③ 停止限速=45
④ 平滑半徑Zsmooth=2 (根據(jù)實際軌跡誤差設(shè)置)
⑤ 連續(xù)倒角平滑zsmooth_start不開啟
⑥ 小圓限速半徑300 (根據(jù)實際機臺效果去設(shè)置)
⑦ 小圓限速最小值50 (根據(jù)實際機臺效果去設(shè)置)
⑧ 誤差系數(shù)Diserr=1 (根據(jù)實際機臺效果去設(shè)置)


推薦參數(shù)設(shè)置4
開啟使用C#平滑函數(shù),并使用控制器內(nèi)置的限速和平滑模式,關(guān)閉連續(xù)倒角平滑。
① 前瞻模式corner_mode=2+8+16+32=58
② Pr12 減速角度=15
③ 停止限速=45
④ 平滑半徑Zsmooth=2(根據(jù)實際軌跡誤差設(shè)置)
⑤ 連續(xù)倒角平滑zsmooth_start開啟
⑥ 誤差系數(shù)Diserr=1 (根據(jù)實際機臺效果去設(shè)置)
⑦ 各軸的corner_accel設(shè)置合理 例如2000,2000,2000
此參數(shù)設(shè)置之后,取代小圓限速。


C#例程實現(xiàn)小線段速度前瞻優(yōu)化
01 例程界面如下

02 初始化連接到控制器
//鏈接private void btn_Connet_Click(object sender, EventArgs e)
{
if (G_CardHandle == (IntPtr)0)
{
btn_Close_Click(sender, e);
}
zmcaux.ZAux_OpenEth("127.0.0.1",out G_CardHandle);
if (G_CardHandle != (IntPtr)0)
{
this.Text = "已鏈接";
}
else
{
MessageBox.Show("鏈接失敗,請選擇正確的LOCAL!");
}
}
03 CAD導(dǎo)入圖形
//CAD圖形導(dǎo)入
private void BTN_IMPORT_Click(object sender, EventArgs e)
{
if (G_CadHandle == (IntPtr)0)
{
if (ZmotionCad.ZMotionCadArray_OpenEth("127.0.0.1", out G_CadHandle) != 0)
{
MessageBox.Show("控制器連接失敗");
return;
}
}
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = "\\";
openFileDialog1.Filter = "DXF File(*.dxf)|*.dxf|PLT File(*.PLT)|*.PLT|AI File(*.AI)|*.AI|DST File(*.DST)|*.DST";
openFileDialog1.RestoreDirectory = true;
openFileDialog1.FilterIndex = 1;
if (openFileDialog1.ShowDialog() == DialogResult.OK) //打開配置文件
{
strFilePath = openFileDialog1.FileName;
int iret = ZmotionCad.ZMotionCadArray_ImportVectGraph(strFilePath, 1024, 1, m_refDistance);
iret = ZmotionCad.ZMotionCadArray_GetVectNum(ref ZCad_ArrayLen); //導(dǎo)入數(shù)據(jù)
ZCad_ArrayInfo = new ZmotionCad.Struct_ZCad_Array[ZCad_ArrayLen];
iret = ZmotionCad.ZMotionCadArray_GetVectArray(ref ZCad_ArrayInfo[0], ZCad_ArrayLen); //獲取圖形數(shù)據(jù)
iret = ZmotionCad.ZMotionCadArray_IfCloseVect(false); //是否只處理封閉軌跡
//合并相連線
iret = ZmotionCad.ZMotionCadArray_MergeSeg(0.5, If_Choose);
Get_Array();
float Image_Left, Image_bottom, Image_Width, Image_Height;
Image_Left = 0;
Image_bottom = 0;
Image_Width = 0;
Image_Height = 0;
iret = ZmotionCad.ZMotionCadArray_GetRange(ref Image_Left, ref Image_bottom, ref Image_Width, ref Image_Height, 0.05);
if (Image_Width < 0.0001 && Image_Height < 0.0001)
{
Image_Left = (float)0.0;
Image_bottom = (float)0.0;
Image_Width = (float)100.0;
Image_Height = (float)100.0;
}
double ObjectPixHeight, ObjectPixWidth;
if (Image_Width * PicHeight <= Image_Height * PicWidth)
{
ObjectPixHeight = PicHeight;
ObjectPixWidth = ObjectPixHeight * Image_Width / Image_Height;
}
else
{
ObjectPixWidth = PicWidth;
ObjectPixHeight = ObjectPixWidth * Image_Height / Image_Width;
}
//縮放比例
double dScale = 0.0;
dScale = ObjectPixHeight / Image_Height;
m_dUnitsPerMm = dScale * 1;
//偏移
m_dTranX = (MyPicture.Width - ObjectPixWidth) / 2 - Image_Left * dScale;
m_dTranY = (MyPicture.Height - ObjectPixHeight) / 2 - Image_bottom * dScale;
Show_Picture();
If_ImportArray = true;
}
}
04 繪制圖形
05 點擊啟動,進行控制器前瞻參數(shù)設(shè)置
private void BTN_RUN_Click(object sender, EventArgs e)
{
if (If_ImportArray == false)
{
MessageBox.Show("未導(dǎo)入加載圖形");
return;
}
Maxspeed = Convert.ToSingle(T_Speed.Text);
Accel = Convert.ToSingle(T_Accel.Text);
Decel = Convert.ToSingle(T_Decel.Text);
Sramp = Convert.ToSingle(T_Sramp.Text);
Lspeed = Convert.ToSingle(T_LSpeed.Text);
Corner_Mode = Convert.ToInt32(T_CornerMode.Text);
LimitR = Convert.ToSingle(T_LimitR.Text);
Limitminspeed = Convert.ToSingle(T_MinSpeed.Text);
Zsmooth = Convert.ToSingle(T_Zsmooth.Text);
DecelAngle = Convert.ToSingle(T_DecelAngle.Text);
StopAngle = Convert.ToSingle(T_StopAngle.Text);
diserr = Convert.ToSingle(T_diserr.Text);
SplineDis = Convert.ToSingle(T_SplineDis.Text);
cornerAccel = Convert.ToSingle(T_CornerAcc.Text);
HighJerk = Convert.ToSingle(T_HighJerk.Text);
FitErr = Convert.ToDouble(T_FitErr.Text);
AxisXnum = Convert.ToInt16(T_AxisXNum.Text);
AxisYnum = Convert.ToInt16(T_AxisYNum.Text);
//初始化參數(shù)
zmcaux.ZAux_Direct_SetSpeed(G_CardHandle, AxisXnum, Maxspeed);
zmcaux.ZAux_Direct_SetAccel(G_CardHandle, AxisXnum, Accel);
zmcaux.ZAux_Direct_SetDecel(G_CardHandle, AxisXnum, Decel);
zmcaux.ZAux_Direct_SetSramp(G_CardHandle, AxisXnum, Sramp);
zmcaux.ZAux_Direct_SetLspeed(G_CardHandle, AxisXnum, Lspeed);
zmcaux.ZAux_Direct_SetMerge(G_CardHandle, AxisXnum, 1);
zmcaux.ZAux_Direct_SetCornerMode(G_CardHandle, AxisXnum, Corner_Mode);
zmcaux.ZAux_Direct_SetFullSpRadius(G_CardHandle, AxisXnum, LimitR);
StringBuilder cmdbuffack = new StringBuilder(2048);
zmcaux.ZAux_Execute(G_CardHandle, "SPLIMIT_RADIUS("+ AxisXnum.ToString() +") = " + Limitminspeed.ToString(), cmdbuffack, 2048);
zmcaux.ZAux_Direct_SetZsmooth(G_CardHandle, AxisXnum, Zsmooth);
zmcaux.ZAux_Direct_SetDecelAngle(G_CardHandle, AxisXnum, (float)((DecelAngle/180)*Math.PI));
zmcaux.ZAux_Direct_SetStopAngle(G_CardHandle, AxisXnum, (float)((DecelAngle / 180) * Math.PI));
zmcaux.ZAux_Direct_SetStartMoveSpeed(G_CardHandle, AxisXnum, Maxspeed );
zmcaux.ZAux_Direct_SetEndMoveSpeed(G_CardHandle, AxisXnum, Maxspeed );
MoveThread = new Thread(new ThreadStart(Thread_Move));
MoveThread.Start();
}
06 軌跡運行線程,開始解析CAD小線段軌跡
//軌跡運行線程
private void Thread_Move()
{
double Pos_x1, Pos_x2, Pos_z1, Pos_y1, Pos_y2, Pos_z2;
double Pos_x1_2, Pos_x2_2, Pos_z1_2, Pos_y1_2, Pos_y2_2, Pos_z2_2;
bool ifsplit = false;
bool ifdownZ = false;
for (int i = 0; i < ZCad_ArrayLen; i++) //遍歷數(shù)組
{
Pos_x1 = ZCad_ArrayInfo[i].x1;
Pos_x2 = ZCad_ArrayInfo[i].x2;
Pos_z1 = ZCad_ArrayInfo[i].z1;
Pos_y1 = ZCad_ArrayInfo[i].y1;
Pos_y2 = ZCad_ArrayInfo[i].y2;
Pos_z2 = ZCad_ArrayInfo[i].z2;
ifsplit = false;
if((If_Choose == true) && (ZCad_ArrayInfo[i].m_nChoose == 0)) continue;
switch (ZCad_ArrayInfo[i].m_nItemtype)
{
case ZmotionCad.ZCAD_ITEMTYPE_VECT: //此處開始是曲線類型
break;
case ZmotionCad.ZCAD_ITEMTYPE_VECTPoint: //點
if (ZCad_ArrayInfo[i].m_nEmptyMove != 0)
//if ((ZCad_ArrayInfo[i].m_nInVectFrist == 1)) //是否軌跡起點起始
{
StartPos(Pos_x1, Pos_y1); //空移到起點
OriginalPos.Clear(); //清空記錄cad點位
SavePos(Pos_x1, Pos_y1); //把起點存下來
}
SavePos(Pos_x2, Pos_y2); //記錄過程點
if (i + 1 < ZCad_ArrayLen)
{
Pos_x1_2 = ZCad_ArrayInfo[i + 1].x1;
Pos_x2_2 = ZCad_ArrayInfo[i + 1].x2;
Pos_z1_2 = ZCad_ArrayInfo[i + 1].z1;
Pos_y1_2 = ZCad_ArrayInfo[i + 1].y1;
Pos_y2_2 = ZCad_ArrayInfo[i + 1].y2;
Pos_z2_2 = ZCad_ArrayInfo[i + 1].z2;
//判斷下個點是否空移點
if ((ZCad_ArrayInfo[i + 1].m_nInVectFrist == 1) ) //下條運動為空移點
{
DownSmoothPos();//下發(fā)軌跡
}
}
break;
case ZmotionCad.ZCAD_ITEMTYPE_VECTArc: //圓、圓弧
break;
default:
break;
}
}
while (true)
{
int idle = 0;
zmcaux.ZAux_Direct_GetIfIdle(G_CardHandle, AxisXnum, ref idle);
if (idle != 0) break;
}
zmcaux.ZAux_Direct_Single_Cancel(G_CardHandle, AxisRnum, 2);
}
//移動到軌跡起點
private void StartPos(double Xpos, double Ypos)
{
//緩沖區(qū)有剩余
while(true)
{
int showbuff = 0;
zmcaux.ZAux_Direct_GetRemain_LineBuffer(G_CardHandle, AxisXnum, ref showbuff);
if (showbuff > 128) break;
}
StringBuilder cmdbuffack = new StringBuilder(2048);
if (ifopenzsmoothmode == true)
{
zmcaux.ZAux_Execute(G_CardHandle, "ZSMOOTH_START()AXIS(" + AxisXnum.ToString() + ")", cmdbuffack, 2048);
}
//空移到起點
zmcaux.ZAux_Direct_SetForceSpeed(G_CardHandle, AxisXnum, Maxspeed);
zmcaux.ZAux_Direct_MoveAbsSp(G_CardHandle, 2, new int[] { AxisXnum, AxisYnum}, new float[] { Convert.ToSingle(Xpos), Convert.ToSingle(Ypos)});
while (true)
{
int idle = 0;
zmcaux.ZAux_Direct_GetIfIdle(G_CardHandle, AxisXnum, ref idle);
if (idle != 0) break;
}
}
07 對提取出的CAD軌跡數(shù)組使用連續(xù)平滑函數(shù),并下發(fā)給控制器執(zhí)行
教學(xué)視頻請點擊→
強實時運動控制內(nèi)核MotionRT750(十一):C#實現(xiàn)CAD導(dǎo)圖和小線段速度前瞻優(yōu)化

正運動技術(shù)專注于運動控制技術(shù)研究和通用運動控制軟硬件產(chǎn)品的研發(fā),是國家級高新技術(shù)企業(yè)。正運動技術(shù)匯集了來自華為、中興等公司的優(yōu)秀人才,在堅持自主創(chuàng)新的同時,積極聯(lián)合各大高校協(xié)同運動控制基礎(chǔ)技術(shù)的研究,是國內(nèi)工控領(lǐng)域發(fā)展最快的企業(yè)之一,也是國內(nèi)少有、完整掌握運動控制核心技術(shù)和實時工控軟件平臺技術(shù)的企業(yè)。主要業(yè)務(wù)有:運動控制卡_運動控制器_EtherCAT運動控制卡_EtherCAT控制器_運動控制系統(tǒng)_視覺控制器__運動控制PLC_運動控制_機器人控制器_視覺定位_XPCIe/XPCI系列運動控制卡等等。
|