2017年12月31日星期日

2017年小结

和往年一样在,2017年年底小结一下本年的情况。

这一年也大概读了六十多本书吧,大概每周读一本书。今年经过努力学习、研究和实践掌握了不少的新技术和领导和管理方法。

长话短说,对我而言2017年最重要的三件事情:

  • 我们家老二出生
  • 公司的产品的产品化,虽然走不少弯路
  • 对团队的培训,团队慢慢显示出了极强的战斗力

今年很多挑战都完成得不错。希望明年能和团队一起继续努力和进步,把公司和公司的产品做得更好。继续努力学习做两个娃的好爸爸,能多一点时间陪陪家人。


2016年12月26日星期一

2016年小结

和往年一样,在2016年年底的小结一下本年的情况。

a. 业余活动

根据在豆瓣上的记录,在2016年我总共读了10本书,但有些书没有记录,大多数都是计算机和机器人方面的书籍,大概也读了10本,读书的明显太少了。观影:20部,大部分都是在汉莎来回德国中国途中看的。如果有空,我还喜欢看看皇马还有曼联的比赛,开始看曼联的比赛因为我最喜欢的穆里尼奥去了曼联。欧洲杯看了不少比赛,特别是葡萄牙队的,他们夺冠很励志。因为回国创业,呆在北京的时间不少,我买了不少小米的产品,这是我最2016年喜欢的品牌,在国内我也是支付宝,微信,京东的忠实用户,非常喜欢国内方便的网上支付和网络购物的优秀体验。2016居然没有写博客,但我实现了2015年底定下的目标,写了一本技术科普书,在年中出版了,而且书中部分章节也刊登在一份不错的商业杂志上。

b. 旅游

因为工作的关系回了7次北京,在国内还去了天津三次,济南两次,上海一次,但是都是在公司或者合作伙伴那里埋头苦干,12月份陪了父亲去了一次颐和园,算是14年前的故地重游。12月份和女儿和老婆还有岳母去了西班牙的Fuerteventura,呆了一个星期,算是唯一的一次度假。对了,2016年在国内和欧洲品尝了不少美食。

c. 工作

国内的公司在今年3月底正式成立,在公司上投入了绝大部分的精力。在北京认识了大量新朋友,结交了不少行业内的大牛。9月份代表公司在汉堡参加的展览会。11月18日顺利地完成了公司的第一轮融资。2017年公司的主力产品完成了5次迭代,5月份搭建好了公司实验室,11月份完成公司办公室的装修,也搭建好了公司基于云端的IT环境。在和公司一起成长的过程中,学习了大量的知识,获取的许多经验,得到了很多见识,我希望未来可以把这些东西整理起来,也写一本书。2016年花了很多时间,讨论公司的发展,定好了公司的文化,包括Vision,Mission和Value。

d. 生活

更加进入了父亲的角色,2016年12月底又要搬家,因为女儿需要更大的空间,还有为了迎接未来的宝宝。

2016年对我来说是一个充满挑战的一年,我认为绝大部分的挑战我都完成的很好,但是也有一些不足的地方。

2017年,希望新公司一切都顺利吧,核心团队建设完成,公司年中能够成功完成新一轮的融资,并且产品上市。如果时间允许的话,我希望可以再写一本书。

2015年12月31日星期四

2015年小结

和往年一样,在2015年的最后一天分几个部分小结一下本年的情况。

a. 业余活动

根据在豆瓣上的记录,在2015年我总共读书:25本,平均:14.44天读一本书,读书的时间明显太少了,因为今年很少坐火车,对我来说坐火车的时候是阅读的最好时间。观影:62部,平均:5.82天看一部电影。2015年博客也写的非常少,只有5篇。2月份3月份,我和老婆喜欢上骑自行车,常常每天骑30到60公里。没事的时候,我还喜欢看看皇马还有切尔西的比赛。


b. 旅游

虽然去的地方很多,特别是北德去了不少地方,但是都是一天内的走马观花的看看,但是几乎没有真正的旅游。柏林连续去了3次,但是都是公事。2月份回了趟中国,给一家公司做培训。


c. 工作

今年彻底从研究所辞职不干了。因为精力有限,退出了一家和以前校友共同合股的公司,将所有的股份都转让了,在这家公司的创业过程中没有赚到任何钱,还搭上了大量的精力,但是收获都很多,经验和眼光都得到很大的提升。一整年都集中精力在做自己的公司的事情,拿到了一些天使投资,正还在筹备做一家科技创业的公司,准备明年初在国内成立,2015年底真是非常忙。6月份花了一个月的时间将机器人的部分控制系统编写完成。7月份,努力了一个月将博士论文的一个部分的代码重写,加入了新的东西。博士论文还是有一搭没一搭的做着。8月份做了一个简单的演讲介绍了一下进度,博士论文还差一个重要的部分需要研究,但是因为实在太缺时间了,不知道什么时候可以最终完成。8月份准备了一个项目的实物演示。9月份带着这个项目的实物演示在德国参加了一个小型展览会,我们的展台很受瞩目,得到了一些小小的进步,增强了我对我们现在做的项目的信心。10月到11月,两个月将所有时间都用在我们国内成立公司的各种事情上。


d. 生活

2015年对我来说最大的事情和最大的成就是,我的女儿年底出生了,我终于升级成爸爸了。因为老婆工作的关系,我们在北德的一个小城租了一个小房子,4月份我花了一个月的时间买家具,进行简单的装修,我们的小房子才终于可以住起来很舒服了,我们一年中有一半的时间住在那里,那里还是挺舒服的,城市不大但是挺漂亮的。



2015年对我来说是一个很折腾又很欢乐的年,搬家,长时间的编程,大量的机器人调试,准备新公司,迎接家庭新成员。

2016年,希望新公司一切都顺利吧,可以完成我的博士论文,然后抽时间写一本中文的技术书,这件事已经想了很久了,希望明年可以做到。

2015年7月15日星期三

最好的"关于什么是回调函数"问题的解答

今天在翻stackoverflow,看到一条解答,差点笑喷,实在牛逼,史上最好的关于什么是回调函数Callback的解释(links),如果你熟悉,Carly Rae Jepsen的Call me maybe这首歌。


2015年5月12日星期二

关于C#连接local database的方法

今天就上一图 关于C#连接local database的方法,这图中包括了代码和VS 2012上如何找到Connection String的方法。


2015年5月11日星期一

使用Emgu CV不要忘记加入OpenCV Libs

记录一个小经验。使用的是Emgu CV 2.410版本,如果编译CameraCapture这样的小程序,我们需要Emgu.CV.dll,Emgu.CV.UI.dll和Emgu.Util.dll加入Project的Reference中去。这样就可以执行这个小程序。



有时候在VS2012中运行编译后的程序有可能会出现上图所示这个问题,可能的原因 1. 没有OpenCV Libs,如果编译成x86,我们就需要把x86的目录放入Debug和Build生成exe的文件夹里面,可以x86这个文件夹从C:\Emgu\bin里面找到。2 也有可能设置Debug和Build的路径问题,只需要确认是否正确设置就可以了。

2015年5月6日星期三

C++中的vector快速拷贝

今天编程中发现新写的程序运行速度很低,经过一番查找才发现是的vector拷贝的效率问题。

//[1] 方法1
vector vec = vec_src;

//[2] 方法2
vector vec(vec_src);

//[3] 方法3
vector vec(vec_src.size());
std::copy( vec_src.begin(), vec_src.end(), vec.begin() );

// 使用的是OpenCV的方法用来测试运行的时间
double t = (double)getTickCount();
t = ((double)getTickCount() - t)/getTickFrequency();
// some codes
cout << "Times passed in milli seconds: " << t * 1000 << endl;

方法3最快,在我的笔记本上用VS2012在32bit中居然比第一种和第二种方法快近10倍,当然了也可以使用memcpy,但是其效率不会比std::copy高多少。

2014年12月31日星期三

2014年小结

在2014年的最后一天分几个部分小结一下本年的情况.

a. 业余活动

刚刚看了阅读DNA对我在豆瓣上的记录统计:
我在2014年共读过58本书,五星好书11本,11月最勤快读了20本,平均:6.28天读一本书.
大概是这个数吧,有时候忘记统计了,有时候想起来的时候一个月把前几个月读过的书都在豆瓣上加上,其实11月没有读20本.平均:6.28天读一本书,大概一个星期读一本书,速度不快不慢.刚刚好,刚刚发现其实在2012年,我也是读了58本书.除了专业的书,2014年我个人比较推荐的五星好书为<房噬>和<费雪论创富>.看来如果即使今年工作很忙的阶段,每个星期读一本书还是可以保证的,把每周零散的看书的时间集成在一起大概有3个小时.

看了46部电影,其中五星电影4部,9月最消遣看了9部,平均:7.91天看一部电影.大部分在家看的,到电影院大概10几次吧,平均每个月一次.只有四部我评为5星<星际穿越><布达佩斯大饭店><纸牌屋 第二季>.加上没有记录的美剧,平均起来的时间,大概也就是每个星期看一部电影看一集美剧,大概每周不到3小时.

读书看片大概是我比较重要的业余消遣,读书其实很多时候读的还是工作上的专业书.大概每周花6个小时来读书看片.加上每周2个小时左右的运动.这个8个小时就是我平时最重要的业余消遣活动.

对了,2014年博客写的也不多,加上这篇才12篇,每月一篇,都是一些技术上的简单记录.希望2015年能有更多的时间来写博客.

b. 旅游

真正的旅游就是2014年春天到西班牙的Teneriffa呆了一个星期吧,满满的美好记忆.其他都是很多很多的德国境内的短途旅游,大多数都是去不同的城市工差办事.

c. 工作

简单提一下2014工作的情况吧:
一个已经做了3年的项目2014年有一个比较大的突破,终于做出了一个可以使用,用户满意的前端版本,从9月底开始了用户使用测试,进行的不断的迭代和纠错,现在用户有了一个相对不错的稳定的硬件平台和相对应的软件.后端程序还是有很多东西需要进一步开发,2014年开发后端程序的时候走了不少弯路,经历了许多方向性错误,经过不停的修正,经历了一个无比痛苦的过程,现在终于走上的正轨,希望在2015年初有一个稳定的后端版本可以推出.个人目标为2015年中可以彻底结束这个项目.

二月底成立了一家新公司.2014年7月艰难地开始一个筹划很久的项目,这个项目年底得到一个小的投资,正式开始.有可能2015年2月前可以得到一个比较大的投资.

2014年可以说是艰苦积累的一年,2015年项目上了轨道,应该会更忙,有可能会经常出差,希望一切顺利吧.

d. 生活

总体上都还行吧,老婆6月底毕业,年底请岳母来德国玩了3个月,生活中的一些新的计划也在有条不紊的进行.

2014年12月23日星期二

关于CLR的runtime的一个小记录

如果在.NET项目中使用Common Language Runtime Support (/clr)编译C++项目,如下图所示,如果使用VS2012会默认使用,.NET framework 4.5:



如果我们使用引用这个通过CLR编译的dll,查看它的属性,也会发现,如下图所示的,这个dll的Runtime Version是v4.0319。



如果我们的项目使用的不是.NET framework 4.5,使用上面所述的CLR编译的项目中的namespace就会出现下面的报错:
Error 492 The type or namespace name 'XXX' could not be found (are you missing a using directive or an assembly reference?)
最简单的解决的方法就是修改我们项目的Target Framework,将其改为4.5就可以了。

2014年9月11日星期四

使用QNetworkAccessManager下载文件的一个问题

今天发现一个问题,使用Qt的QNetworkAccessManager进行下载,将其放入一个QPushButton的clicked()的slots,但是无法正确执行下载文件,想了半天,还是没有搞明白,最后在stackoverflow在找到这个问题的解决方法,才明白,因为QNetworkAccessManager是非同步的,它需要一个event loop去开始下载,而我们执行clicked()这个slots,它会给一个control back给event loop,但是QNetworkAccessManager以及被销毁了,没有时间去做QNetworkAccessManager的下载文件。

解决方法:如果加入一个QMessageBox,这样就会启动另一个event loop在这个slot里面,这样QNetworkAccessManager就会有机会完成下载文件这个工作。

链接:
http://stackoverflow.com/questions/7870017/how-can-i-download-file-from-the-internet-in-qt

2014年9月8日星期一

OpenCV放大或者缩小图像的速度

使用OpenCV放大或者缩小图像,我们比较熟悉的是下面的function:
cv::resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )¶
http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html
关于它的Interpolation method(插值方法),其中:

INTER_NEAREST 最近邻插值,是最快的method并且创建blocky images并选择1个pixel去替代几个pixels,这样做得到图像的结果效果比较差。
INTER_AREA 也是一个快速计算方法,它取几个pixels的平均值,所以它比较适合缩小图像,而不是放大图像。
INTER_LINEAR 使用双线性的插值去改变图像尺寸,组成几个pixels在一起(在很多情况下是比较好的选择,但是计算速度比较慢)。
INTER_CUBIC 使用的是双三次的插值,但是计算机量比较大,所以运行速度慢,而且有时候结果看起来比较好,有时候比较差。

非常简单地,不完全正确地说,在速度上:
INTER_NEAREST > INTER_AREA > INTER_LINEAR > INTER_CUBIC
但是放大或者缩小图像后的效果上一般而言INTER_LINEAR是相对最好的。

其实,也可以使用Opencv的cv::pyrUp(使用Gaussian 金字塔分解对输入图像向上采样)和cv::pyrDown(使用 Gaussian金字塔分解对输入图像向下采样),关于使用这两个function去放大或者缩小图像,具体信息可查阅下面链接:
http://docs.opencv.org/doc/tutorials/imgproc/pyramids/pyramids.html
但是cv::pyrUp和cv::pyrDown的运算速度其实也并不高。

2014年9月7日星期日

libVLC进行memory stream延迟问题

最近我使用libVLC进行在server端进行memory stream,出现了一个问题,client端得到的视频有7秒的延迟。类似以下帖子提到的问题:
http://stackoverflow.com/questions/19604815/main-input-error-and-delays-when-libvlc-stream-images-in-memory

为了找到错误我打开以下的参数:
"--verbose=2", // Be much more verbose then normal for debugging purpose
这样可以得到更多的debug信息。
我得到这样的信息:main warning: late buffer for mux input

经过查阅发现,正确的解决方法就是,在transcode里设置venc=x264{preset=ultrafast,tune=zerolatency}这样的参数:

sprintf(smem_options_transcode,"#transcode{venc=x264{preset=ultrafast,tune=zerolatency},acodec=none}:rtp{mux=ts,dst=127.0.0.1,port=5004}");

这样延迟可以控制在3秒以内,当然了,可以使用其他的方法进一步减少延迟,譬如在client端减少caching的数值等等。

解决方法参考:
https://forum.videolan.org/viewtopic.php?f=4&t=95364

2014年8月19日星期二

Qt Webkit 加入新的plugin路径

在Qt中使用QWebView播放flash文档(swf格式),需要加入NPSWF32.dll这个plugin,如果使用plugin要使用下面代码,去允许使用plugin:

QWebSettings *settings = QWebSettings::globalSettings();

settings->setAttribute (QWebSettings::PluginsEnabled, true);

但是如果还是无法显示flash文档,其实原因是Qt无法找到正确的plugin路径,需要使用类似以下代码,告诉Qt正确的含有NPSWF32.dll的plugin路径:

QString path  = QDir::currentPath() + "/webplugins";

qputenv("QTWEBKIT_PLUGIN_PATH", path.toLocal8Bit());

2014年8月12日星期二

设置GigEVision相机使用固定IP

如果使用Stemmer Imaging的CVB软件,可以在Camera的Properties里面设定:
在GigEVisionTransportLayer里面:
GevCurrentIPAddress            169.254.1.10
GevCurrentSubnetMask        255.255.0.0
GevPersistentDefaultGateway    0.0.0.0
GevIPConfiguration PersistenIP
在UserSets里面,将上面的设置储存,下次启动相机的时候上面的设置将会被使用:
User Set Default Selector    UserSet1
set User Save-->Execute
如果要加快计算机接上GigEVision相机后找到相机的速度
也可以将计算机的Lan Adapter设成固定的IP
譬如说:
IP address: 169.254.200.9
Subnetzmake: 255.255.0.0
Standardgateway: 放空


关于自动专用IP寻址的介绍:
我们上面使用的是Automatic Private IP Addressing (from 169.254.0.0 - 169.254.255.255) 它们的subnet mask value 是 255.255.0.0。其实是Windows 计算机自动专用IP寻址(APIPA)是DHCP故障转移机制。自动专用IP 寻址(APIPA) 协议,就是, 当无DHCP 服务器时,通过APIPA, DHCP 客户端可自动配置IP 地址和子网掩码。

The Internet Assigned Numbers Authority (IANA) has reserved 169.254.0.0 through169.254.255.255 for Automatic Private IP Addressing. As a result, Automatic Private IP Addressing provides an address that is guaranteed not to conflict with routable addresses.



关于使用私有IP的介绍:
http://zh.wikipedia.org/wiki/%E4%B8%93%E7%94%A8%E7%BD%91%E7%BB%9C
在互联网的地址架构中,专用网络是指遵守RFC 1918和RFC 4193规范,使用私有IP地址空间的网络。私有IP无法直接连接互联网,需要公网IP转发。与公网IP相比,私有IP是免费的,也节省了IP地址资源,适合在局域网使用。私有IP地址在internet中不会被分配。

private-IPv4-addr

2014年8月5日星期二

使用MP4Box对MP4视频文件加入Chapters


今天我尝试着使用FFmpeg对MP4视频文件加入Chapters(片段,段落,章节),这样可以在播放视频的时候直接跳到不同的片段,使用FFmpeg经过多次尝试均不成功,经过一番搜索,发现MP4Box这个免费工具,它可以非常轻松的完成我的需要。
先下载并安装MP4Box: http://www.videohelp.com/tools/mp4box ,我使用的是MP4BOX_GPAC.Framework.Setup-0.5.0这个版本。
然后写一个关于例如下面所示的的Chapter设置文档,保存成txt格式。
CHAPTER1=00:00:00.000
CHAPTER1NAME=Chapter 001
CHAPTER2=00:01:10.222
CHAPTER2NAME=Chapter 002
CHAPTER3=00:02:00.70
CHAPTER3NAME=Chapter 003
最后使用以下命令行,使用VLC打开生成的test.mp4文件,就可以发现文档中包含了3个片段。
MP4Box -add my_video.mp4 -chap chapters_file.txt test.mp4

2014年6月25日星期三

重新写一个精简的核心库

最近的带的项目陷入了软件开发的危机,原因是陷入自家写的库造成的泥沼越来越深。

最近几年带的大的软件项目都是使用自家写的库,工具库utils,开发库commDev,核心库core,api库,可视化库viz等等。当然了使用自家的库开发软件有时候非常有效率,但是自家开发库的升级以及维护绝对是一个大问题,维护超过5万行程序本身就是一个大问题,而且这几年来因为项目压力,常常直接将很多东西放入核心库core里,导致核心库臃肿不堪,而且关于库的使用的实例程序以及接口或者api更本做不到时常更新,有很多文档已经四五年了,更本无法使用,所以导致最最大的痛苦是教新人使用我们的库。更为恐怖的是核心库对其他外部库的依赖越来越多,从OpenCV,Boost到现在的至少10个以上的第三方库,但是核心库更本也没有根据外部库进行更新,至今核心库还在使用OpenCV2.0。更为痛苦的是自家写的库还是使用VS2008进行编译,因为实在太大,以至于没有人有勇气进行修整,并使用最新的编译器进行编译。


现在实在受不了了,我终于决定重写核心库,并且放弃工具库utils,开发库commDev,api库,可视化库viz。新的核心库只有两个依赖OpenCV和Qt这两个第三方库的巨无霸。放弃的工具库utils,开发库commDev,api库,可视化库viz,全部使用Qt代替。新的核心库就叫CoreLite,只依赖于最新的Qt5.3和OpenCV2.49,保持绝对的精简,而且可以根据Qt和OpenCV的升级进行编译,而且使用VS2012进行开发和编译,希望能做到根据OpenCV更新的频率进入版本更新。

  • 新的库CoreLite的第一个tag就是CoreLite290,使用和OpenCV一样的文档结构。
    \build\include
    \build\x86 (\build\x86\vc11\bin, \build\x86\vc11\lib)
    \sources\modules\
  • 新的库使用Qt的QThread。
  • 控制Class的总数,只包括Qt或OpenCV无法提供的一些特性,例如Producer-Comsumer-Data Sink结构。
  • 带几个实例。
  • 保证库的可读性,使用Qt的api的写作标准。
  • 最大程度保证库的可维护性,其实就是要保持精简。

目前想到的就是这些了,以后在重新的过程中,如果还有什么想法,我希望能写下来记录一下,期望可以用一个星期将新的核心库改写完成。

2014年6月14日星期六

VS 2008编译的程序部署的一个问题解决

最近遇到一个问题,在一台机器上使用VS 2008编译的程序无法在其他机器上运行,马上想到了以前提到过的关于Side-by-Side问题, 但是安装了Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)后程序还是无法运行,而且没有什么错误信息。然后使用Windows里的Computer Management里的Event Viewer的Windows Logs发现这个程序无法运行的原因在于其调用的一个动态链接库DLL。然后我查看了一下这个DLL的Manifest,原来多了一个Microshoft.VC90.DebugCRT的依赖,如下图所示。如果我们在机器上没有安装VS 2008当然就会没有Microshoft.VC90.DebugCRT的依赖需要的msvcm90d.dll,msvcp90d.dll,msvcr90d.dll,所以程序就无法运行了。

manifest_vs2008_debug
解决的方法就是使用在release模式下编译,或者如下图所示,修改C++ Project的Property里的Linker-->Debugging选项页,将Generate Debug Info修改成No,将Debuggable Assembly改成No Debuggable attribute emitted,原来如下图a所示,修改后如下图b所示:

debuggable_assembly_debug_modedebuggable_assembly_release_mode

现在再编译一次,查看一下新生成的DLL的Manifest可以发现Microshoft.VC90.DebugCRT的依赖已经没有了,现在程序应该可以在其他机器上运行了。

manifest_vs2008_release

2014年1月27日星期一

Emgu CV使用1

最近开始使用Emgu CV,也就是在.NET可以使用的OpenCV,Emgu CV是一个.Net的wrapper。使用从C++转到C#中写OpenCV代码,开始时候还真的很不习惯,以下将简单整理一下最近的一些笔记。

如何将Grayimage转换到Matrix<float>,注意rows cols和height width的关系

Image<Gray, float> img = new Image<Gray, float>("c:\\test_image.jpg");
int rows = img.Height;
int cols = img.Width;
Matrix<float> tmp_matrix= new Matrix<float>(rows, cols);
CvInvoke.cvConvert(img, tmp_matrix);
       

如何显示图

//The name of the window
String win1 = "Test Window";
//Create the window using the specific name
CvInvoke.cvNamedWindow(win1);
Image<Bgr, Byte> img = new Image<Bgr, Byte>("c:\\test_image.jpg");
CvInvoke.cvShowImage(win1, img.Ptr);
//Wait for the key pressing event
CvInvoke.cvWaitKey(1);
//Destory the window
CvInvoke.cvDestroyWindow(win1);
           

如何画一个正方形在图上

Rectangle box = new Rectangle(121, 57, 75, 97);
Image<Bgr, Byte> img = new Image<Bgr, Byte>("c:\\test_image.jpg");
img.Draw(box, new Bgr(Color.DarkOrange), 2);

如何计算一个积分图integral image,在C++中我们可以使用integral(frame, imageIntegral, CV_32F),在C#中可以这样做:

Image<Gray, double> cvImageIntegral = null;
cvImageIntegral = frame.Integral();

如何计算标准差,标准差就是方差的算术平方根,反映组内个体间的离散程度,标准差与期望值之比为标准离差率。

Matrix<float> mat = ... // your input matrix
MCvScalar average = new MCvScalar();
MCvScalar std = new MCvSaclar();
CvInvoke.cvAvgSdv(mat, ref average, ref std, IntPtr.Zero);

2014年1月8日星期三

优化网卡用于machine vision

以下设定最好是使用Intel network chipset的网卡,并确保使用最新的驱动

我们要做的就是optimize bandwidth,improve efficiency

在Win7下选择Local Area Connection → 鼠标右键,点选Properties → 点击Configure → 选择Advanced Tab

1. set interrupt moderation rate to extreme

2. set maximize jumbo packets

3. maximize number of receive buffers

4. disable power saving on the network card

2013年12月26日星期四

TWINCAT 3使用记录4: EtherCAT "Compatible" 网卡

如果要使用real-time特性,那么需要我们的网卡支持。据我的测试(五台不同的笔记本,一台台式机),所有使用Intel芯片的网卡都支持real-time,其他的芯片组都不支持。网上据说Realtek 的部分芯片组支持,但是我没有测试过。

理论上系统允许我们使用所谓的"incompatible"网卡,但是real-time特性会被限制,而且无法对其安装TwinCAT的real-time Ethernet驱动。

总结最好就是使用EtherCAT "Compatible" 网卡,最简单的方法就是选择带有Intel芯片的网卡。