2019年5月23日 星期四

同軸度 Coaxiality

同軸度和同心度是兩個非常容易搞混的幾何公差.
同軸度的符號如下:
跟正位度的符號是一樣的!
有這種設定,主要是它的定義和正位度的使用方法很像,反而跟同心度沒這麼相似.
首先來個範例:
由於這個不是繪圖軟體做的,只是示意用,不合工程圖規範的部分還請包涵.
這個是一個軸的側面視圖,直徑較大的部分為基準,直徑較小的部分是要比較的部分.
同軸度要怎麼解讀呢? 首先以大圓柱作為基準,畫出基準軸,如下圖:



而作為比較的小圓柱,也畫出自己的軸,小圓柱本身的軸偏差不能超過以大圓柱軸為中心,直徑0.5的圓柱體公差帶範圍內,如下圖所示.
而同心度,則是取一個截面圓的中心點作為基準,而被量測的特徵也是取一個截面的圓的中心點作為判斷依據,可以說是點對點的比較.
雖然同軸度和同心度名字上聽起來很像,但是操作和執行量測上的方式可是完全不同的,希望這篇文有解除大家的疑惑.


2019年5月21日 星期二

同心度 Concentricity

同心度和正位度都是幾何公差的一種,同心度的定義(作者自己的定義),以參考圓的中心點為基準點,所量測圓的中心點必須落在基準點為圓心的特定直徑的範圍內。
用圖來解釋比較快:
同心度的符號如下,
由於同心度也得需要基準作為比對,因此在符號後面會註記所對應的基準特徵.
下圖是比例沒有很好的範例:
大家可以看到,基準A是外圓,而內圓是要比對的部分,首先找到外圓的中心點

在工程圖上大家可以看到,圖紙的要求是直徑0.5,接著在外圓中心點畫出直徑為0.5的圓(黃色部份).
如果內圓的中心點有落在這個黃色範圍內,就算符合公差.
如果沒在黃色範圍內,則NG.

以上是同心度的簡單介紹,由於同心度和內外圓的直徑大小沒有關聯,除非有考量材料條件,因此在工程圖上就沒標示,以免誤導.

以C# 實作MODBUS TCP

最近在弄MODBUS TCP的東西,但又不想引用第三方的LIBRARY,所以就從底層做起。
簡單來說, 用socket傳送 byte array就搞定了。 不好處理的是byte array的設定,以下是簡易的設定說明。


寫入output register

MODBUS TCP的 byte array如下:

 byte[] array=
{
0,0,// transaction id , no use in this case
0,0,// id no use in this case
0,0x6,// length of data
0,// device number, no use in this case
0x6,//function code
0x1F, 0xBB,// Start Address
0x0,0x1//Force data
};

解釋一下這些的意義:
0,0,// transaction id , no use in this case
在MODBUS TCP可以不指定,或是任意指定也可,SLAVE裝置回傳的前兩個byte就是這兩碼。
0,0,// id no use in this case
這個也是可以隨意指定。
0,0x6,// length of data 這兩個byte代表要傳輸的訊息的byte length,


0,// device number, no use in this case
0x6,//function code
0x1F, 0xBB,// Start Address
0x0,0x1//Force data

到這裡總共有6個bytes,所以長度為6

0,// device number, no use in this case
裝置號碼,在有IP位置的情況下可以不用設定。

0x6,//function code
這個就是重點了,MODBUS的指令,
這個是寫入特定output register的代碼,
不同廠商的function code有些許不同,但大致如下:

讀取多個registers : 0x3
讀取單個 input register : 0x4
寫入 coil : 0x5
寫入單個 output register : 0x6
(其他的網路上都找得到,這邊只列常用的)

0x1F, 0xBB,// Start Address
這邊是指定要寫入的位址,每家廠商定義的位址都不一樣,得自己慢慢看原廠手冊。

0x0,0x1//Force data
這邊是讓該位址ON的指令,每家廠商設定不一樣,得自己慢慢看原廠手冊。


讀取register狀態

 byte[] array=
{
0,0,// transaction id , no use in this case
0,0,// id no use in this case
0,0x6,// length of data
0,// device number, no use in this case
0x3,//function code
0x00, 0xAB,// Start Address
0x0,0x2//Number of registers
};


大部分都和上面一樣,不同的是function code,這邊是0x3,另外是最後的兩個bytes,是一對High/Low byte,用來指定要讀取的register的數量。在這邊Address和register是同義。
回傳的資訊就是該Address的IO狀態了。

以下是簡易實作的程式碼:

var socket=new Socket( SocketType.Stream, ProtocolType.Tcp);
var Addr=new IPAddress (new byte[]{168,192,1,1});//slave device ip
int port=502;
var IEP = new IPEndPoint(Addr,port);

socket.Connect(IEP as EndPoint);

if(socket.Connected)
{
socket.send(array);
var buffer=new byte[1024];
int L= socket.recieve(buffer);
}

以上就是Modbus TCP的實作。

2021.Mar.24 Add:
Modbus specification:
https://modbus.org/specs.php











同軸度 Coaxiality

同軸度和同心度是兩個非常容易搞混的幾何公差. 同軸度的符號如下: 跟正位度的符號是一樣的! 有這種設定,主要是它的定義和正位度的使用方法很像,反而跟同心度沒這麼相似. 首先來個範例: 由於這個不是繪圖軟體做的,只是示意用,不合工程圖規範的部分還請包涵. 這個是...