強實時運動控製內核MotionRT750
MotionRT750是正運動技術首家自主自研的x86架構Windows係統或Linux係統下獨占確定CPU的強實時運動控製內核。

該方案采用獨占確定CPU內核技術實現超強性能的強實時運動控製。它將核心的運動控製、機器人算法、數控(CNC)及機器視覺等強實時的任務,集中運行在1-2個專用CPU核上。與此同時,其餘CPU核則專注於處理Windows/Linux相關的非實時任務。
此外集成MotionRT750 Runtime實時層與操作係統非實時層,並利用高速共享內存進行數據交互,顯著提升了運動控製與上層應用間的通信效率及函數執行速度,最終實現更穩定、更高效的智能裝備控製,確保了運動控製任務的絕對實時性與係統穩定性,特別適用於半導體、電子裝備等高速高精的應用場合。

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



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

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


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


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

XPCIE1032H硬件特性:
1.6-64軸EtherCAT總線+脈衝可選,其中4路單端500KHz脈衝輸出。
2.16軸EtherCAT同步周期500us,支持多卡聯動。
3.板載16點通用輸入,16點通用輸出,其中8路高速輸入和16路高速輸出。
4.通過EtherCAT總線,可擴展到512個隔離輸入或輸出口。
5.支持PWM輸出、精準輸出、PSO硬件位置比較輸出、視覺飛拍等。
6.支持直線插補、圓弧插補、連續軌跡加工(速度前瞻)。
7.支持電子凸輪、電子齒輪、位置鎖存、同步跟隨、虛擬軸、螺距補償等功能。
8.支持30+機械手模型正逆解模型算法,比如SCARA、Delta、UVW、4軸/5軸 RTCP...
更多關於XPCIE1032H詳情點擊“不止10倍提速!PCIe EtherCAT實時運動控製卡XPCIE1032H 等您評測!”查看。
C#實現CAD解析及如何對小線段軌跡進行運動前瞻
CAD具有繪圖效率高,速度快,精度高,便於交流等優點,所以得到了廣泛的應用。CAD伴隨著整個PC基礎工業的突飛猛進,正迅速而深刻地影響著設計和繪圖的基本方法。
但是在實際應用過程中,如果CAD導dao圖tu的de軌gui跡ji是shi較jiao為wei複fu雜za的de異yi形xing軌gui跡ji,那na麼me結jie果guo會hui導dao出chu來lai大da量liang小xiao線xian段duan。這zhe時shi候hou要yao保bao證zheng機ji台tai加jia工gong高gao效xiao平ping穩wen,需xu要yao通tong過guo運yun動dong前qian瞻zhan算suan法fa對dui軌gui跡ji進jin行xing一yi定ding程cheng度du的de平ping滑hua,並bing且qie在zai拐guai彎wan點dian合he理li降jiang速su,曲qu線xian段duan整zheng體ti也ye要yao合he理li降jiang速su,保bao證zheng各ge分fen軸zhou速su度du連lian續xu不bu出chu現xian速su度du突tu變bian。
01 CAD圖紙解析
正運動技術提供開放的ZmotionCadEx庫,可導入DXF、Ai、Plt、Dst圖紙,可以生成運動坐標數據轉G代碼、zbasic運動指令,或直接PC函數執行運動。


02 開啟控製器的運動前瞻
之前推文也有介紹過,控製器的運動前瞻主要通過Corner_mode進行設置。
1.CornerMode功能前瞻設置說明
第一,它可對指令進行整體規劃,即ji對dui各ge段duan速su度du進jin行xing整zheng體ti規gui劃hua,再zai配pei合he指zhi令ling段duan內nei的de加jia減jian速su控kong製zhi,可ke以yi使shi機ji床chuang保bao持chi高gao速su運yun行xing提ti高gao效xiao率lv,使shi負fu載zai運yun動dong更geng加jia流liu暢chang,告gao別bie停ting停ting走zou走zou,係統通過Merge速度融合功能實現。
第二,它可保證在高速運行的基礎上為了限製機械衝擊和過切等,進行減速識別,通過提前識別軌跡變化,從而按照安全的減速度提前減速,係統通過減速/停止融合功能、抑製衝擊功能實現。
綜上所述,速度前瞻功能既可提升整機效率,也可減少衝擊增加柔性,降低零部件磨損,增加設備使用壽命。
(1)拐角減速
拐角減速功能解決的問題是:當指令間夾角過大時,如果仍以較大速度運行,會在夾角處產生較大的機械衝擊,軌跡偏離。

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

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

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

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

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

②開啟倒角

設置CORNER_MODE主要用到了下麵幾個函數接口:

①

②

③

④

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


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

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

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

其中pDataPoints是傳入的cad導出的小線段數組,通過設定對應參數後會
pSmoothPoints :平滑過後的坐標點集
parryLmtSp:輸出每個店限速(mm/s),對應每條線段,用movelimit運行,<=0就不用設置// parryForceSp:輸出的每段force_speed運行速度
然後根據輸出結果按照流程使用對應函數下發給控製器執行。



其它傳參為平滑時候所需要的參數,他們作用如下:
disErr : 參考誤差係數(設置越大,拐點處軌跡誤差越大,默認可輸入1)
用yong來lai控kong製zhi高gao級ji平ping滑hua算suan法fa平ping滑hua後hou的de軌gui跡ji與yu原yuan軌gui跡ji之zhi間jian最zui大da參can考kao誤wu差cha,當dang此ci參can數shu設she置zhi越yue大da,平ping滑hua後hou的de軌gui跡ji距ju離li原yuan軌gui跡ji的de最zui大da誤wu差cha也ye越yue大da,同tong時shi平ping滑hua效xiao果guo越yue好hao,運yun動dong時shi的de速su度du可ke以yi達da到dao更geng快kuai,曲qu率lv大da的de地di方fang過guo彎wan速su度du可ke以yi更geng快kuai,反fan之zhi則ze是shi相xiang反fan的de效xiao果guo。
同一段軌跡:
·此參數是設置為1.0

·此參數設3.0

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

·設置為10倍:

plimitR :限速半徑數組,不同的限速半徑對應不同的限速值
plimitRSp : 限速半徑速度數組,和限速半徑數組對應
limitRCnt: 限速半徑的個數
用來根據曲率半徑對應的限製速度進行曲線段限速,和控製器底層的小圓限速區別在於:
小圓限速隻需要設置最大限速半徑,限製速度和最小速度,然後根據實際圓速度=限製速度*實際半徑/限速最大半徑進行線性限速;
該(gai)函(han)數(shu)可(ke)以(yi)通(tong)過(guo)設(she)置(zhi)分(fen)段(duan)限(xian)速(su),應(ying)對(dui)上(shang)麵(mian)小(xiao)圓(yuan)限(xian)速(su)效(xiao)果(guo)不(bu)好(hao)的(de)時(shi)候(hou),更(geng)可(ke)以(yi)根(gen)據(ju)實(shi)際(ji)機(ji)台(tai)效(xiao)果(guo)進(jin)行(xing)設(she)置(zhi),比(bi)如(ru)設(she)置(zhi)限(xian)速(su)半(ban)徑(jing)和(he)對(dui)應(ying)限(xian)速(su)值(zhi)為(wei):

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

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

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


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


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


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


C#例程實現小線段速度前瞻優化
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導入圖形
//CAD圖形導入
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); //導入數據
ZCad_ArrayInfo = new ZmotionCad.Struct_ZCad_Array[ZCad_ArrayLen];
iret = ZmotionCad.ZMotionCadArray_GetVectArray(ref ZCad_ArrayInfo[0], ZCad_ArrayLen); //獲取圖形數據
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 點擊啟動,進行控製器前瞻參數設置
private void BTN_RUN_Click(object sender, EventArgs e)
{
if (If_ImportArray == false)
{
MessageBox.Show("未導入加載圖形");
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);
//初始化參數
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++) //遍曆數組
{
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();//下發軌跡
}
}
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)
{
//緩衝區有剩餘
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軌跡數組使用連續平滑函數,並下發給控製器執行
教學視頻請點擊→
強實時運動控製內核MotionRT750(十一):C#實現CAD導圖和小線段速度前瞻優化

正運動技術專注於運動控製技術研究和通用運動控製軟硬件產品的研發,是國家級高新技術企業。正運動技術彙集了來自華為、中(zhong)興(xing)等(deng)公(gong)司(si)的(de)優(you)秀(xiu)人(ren)才(cai),在(zai)堅(jian)持(chi)自(zi)主(zhu)創(chuang)新(xin)的(de)同(tong)時(shi),積(ji)極(ji)聯(lian)合(he)各(ge)大(da)高(gao)校(xiao)協(xie)同(tong)運(yun)動(dong)控(kong)製(zhi)基(ji)礎(chu)技(ji)術(shu)的(de)研(yan)究(jiu),是(shi)國(guo)內(nei)工(gong)控(kong)領(ling)域(yu)發(fa)展(zhan)最(zui)快(kuai)的(de)企(qi)業(ye)之(zhi)一(yi),也(ye)是(shi)國(guo)內(nei)少(shao)有(you)、完整掌握運動控製核心技術和實時工控軟件平台技術的企業。主要業務有:運動控製卡_運動控製器_EtherCAT運動控製卡_EtherCAT控製器_運動控製係統_視覺控製器__運動控製PLC_運動控製_機器人控製器_視覺定位_XPCIe/XPCI係列運動控製卡等等。
|