2018年12月26日 星期三

什麼是 Modbus?


什麼是 Modbus?
  • Modbus是由Modicon公司(現為Schneider的 一個品牌)在1978年提出的
  • Modbus由於易學易用,耗費系統資源極低, 是工業控制領域的一個通訊標準  
  • Modbus 被廣泛應用在 PLC 與 多功能電表等 設備中  
  • 1998年Schneider又推出了TCP/IP乙太網路的 ModbusTCP,使 MODBUS 應用更推向網際 網路。
  • Modbus 是一種需求-回應協定,採用主從架構實作而成。 
  • Modbus允許多個 (大約240個) 裝置連接在同一個網路上進行通訊
    • 舉個例子,一個由測量溫度和濕度的裝置,並且將結果傳送給電腦。在資料採集與監視控制系統(SCADA)中,Modbus通常用來連接監控電腦和遠端終端控制系統(RTU)

網路特性
  • 按電氣特性可分為RS-232、RS-422與RS485。  
  • 按照資料流程的方向可分成兩種基本的傳送方 式:全雙工、半雙工。  
  • RS-485 半雙工通訊由於只需要兩條通訊線, 且通訊距離長,被廣泛用在分散式的控制網路 架構。

MODBUS 協定
  • Modbus協定是主(Master)/僕(Slave)通訊協定; 網路上的每個 Slave 設備必須有唯一的位址(範圍從1到247)
  • 主從架構的通訊作業會成雙成對的出現,必須有個裝置啟動需求並等候回應,也就是說,這個啟動需求的裝置 (主要裝置) 會負責啟動每一次互動。
  • Slave 位址用於定址 Slave 設備,由Master發 起; 位址0用於廣播模式,不需要回應;  
  • 傳輸模式 依照編碼方式可以分為 RTU 與 ASCII模式


MODBUS RTU 模式




  • 使用 16 進制編碼  
  • 使用兩個 Byte 的 CRC 校驗碼  
  • 相較於 ASCII 節省一半的通訊量  
  • CRC校驗遠較LRC運算嚴謹
    • CRC為校驗和的一種,是兩個位元組資料流採用二進制除法(沒有進位,使用XOR來代替減法)相除所得到的餘數。

MODBUS ASCII 模式


  • 封包必須以“ : ”開始,以“CR -LF”結束;  
  • 資料用十六進位 ASCII 碼值表示;  
  • 使用LRC進行錯誤校驗;
    • 將所有位元組相加,捨去進位,然後取2的補數,即為 LRC 的演算法
  • 相較於 RTU 模式可以直接由文字通訊程式進行傳輸

MODBUS TCP
  • IANA (Internet Assigned Numbers Authority:網際網路編號分配管理機構)已為 Modbus協議指配TCP / UDP埠502  
  • Modbus TCP 資料封包包含了MBAP標頭,功能碼和資料三部分
  • MBAP Modbus Application Protocol

Modbus 模擬情境:
  • 像是一個部隊,有一位連長(Master),跟一群大頭兵(slave)
    (Master只有一個.其他都是slave)  
  • 操練中,只有連長(Master)可以說話,大頭兵(slave)不能主動說話,但可以回應。
    (資料的傳送必須由Master開始,slave只是回應。)  
  • 連長可傳送資訊給大頭兵,也可以問大頭兵的狀況
     (Master可以送給slave資料,或是詢問slave的資料) 
  • 大頭兵人多,每個人都有兵籍編號
    (slave 是以站號來區別)  
  • 連長在連集合場講話,或是大頭兵回話,不管連長或大頭兵都聽得到。
    (Master 或Slave 通訊時,每一站都收得到。)

reference:

2018年12月25日 星期二

[MongoDB] C# Driver 時間查詢問題


今天查詢 MongoDB 帶時間條件遇到一個怪問題,
時間條件設定為 2018-12-24T16:00:00Z
但進資料庫查詢時,總是被改成 ISODate("2018-12-24T08:00:00Z")

經一番查詢後,發現 MongoDB driver 在查詢時,
會自動依執行環境的 Time Zone 改成 UTC 時間,
所以才會發生這個怪現象
2018-12-24T16:00:00Z  → time zone (utc+8) → 2018-12-24T08:00:00Z


那該如何解決呢?
var queryDate = new DateTime(2018, 12, 24, 0, 0, 0, DateTimeKind.Utc);
在建立DateTime 時,帶入 DateTimeKind.Utc  ,
即告訴 driver 時間已經是 UTC 時間,
所以不用再幫我轉囉!!
reference: https://stackoverflow.com/questions/19350348/mongodb-c-sharp-driver-and-isodate

2018年12月24日 星期一

如何建立 Aexa Web Service ?


建立 alexa web service 需要以下幾個步驟∶

  • 建立web server (Restful Web API)
  • 建立憑證 (可用私有憑證) 
  • alexa configuration
  • service simulator 

建立web server (Restful Web API)
  • alexa-app: 
    • 已對 alexa voice service 寫好對應的方法及模組,可快速進行開發
    • A Node module to simplify the development of Alexa skills (applications.) 
    • https://github.com/alexa-js/alexa-app

  • alexa-app-server: 
    • 基於上述 alexa-app module 提供 web server 服務,方便開發人員串接 alexa vocie service
    • An Alexa App (Skill) Server module using Node.js and the alexa-app module. 
    • The alexa-app-server module offers a stand-alone web server to host Alexa Apps (Skills). 
    •  Think of it as a simple "container" that allows you to easily publish multiple Alexa Apps with one server. 
    •  This module does not help you write the Alexa Apps (Skills) themselves, as apps are independent modules, written using the alexa-app framework. URL: 
    • https://alexasaturn.tk/alexa/color_picker



建立憑證 (可用私有憑證)

  • Create self-signed certificate語法如下∶
  • 此處要注意一點,必須申請 DNS 並寫入憑證內,才可正常串接服務



alexa configuration
  • Configuration 勾選 Https
  • Default 輸入 URL

  • Self-signed SSL Certificate 
    • 勾選 I will upload a self-signed certificate in X.509 format 
    • 再將憑證內容貼上

service simulator

  • 可用 Test 下的 service simulator 進行測試



Alexa 架構



Alexa 是什麼?

亞馬遜公司所發售Amazon Echo(智慧喇叭)內搭載的智慧型語音助理 - Alexa


Alexa 能做些什麼?

在於「操作顛覆」,其他已上市的 IoT 系統幾乎以「觸控」操作來完成,語音助理 Siri、Google Now 只能做為輔助工具,在 Amazon Echo,以語音為主要操控方式,使用者只靠說話就能與之互動,透過語音下達指令,Alexa 可以為你閱讀新聞、查看天氣與交通狀況,撥流行音樂、確認行事曆、訂Pizza、叫車、買東西等,可說是一款語音助理與生活相互融合的絕佳範例。


開發者可用Alexa Skills Kit 開發自己的Alexa Skill。例如美國最大的餐點外送公司Grubhub在Alexa 上的開頭語是:「Alexa, tell Grubhub I’m hungry」;Uber 則是用:「Alexa, ask Uber to request a ride!」。許多企業都在思考該如何以最直覺的方式讓人們完成點餐、搭車等等的服務,讓消費者更快下決定,有效提高下單率!

架構

  • Framework: alexa-app-server (nodejs) 
  • 溝通需使用 https (self-signed certificate 需參考官方文件) 
  • Backend 主要的對象是 Intent event,依不同的event進行回應 
  • 依需求,溝通過程不主動關閉 session 需在8秒內回應 response,否則將被強制關閉 session


Intent 範例



2018年12月23日 星期日

什麼是 RS485?

什麼是 RS-422?

RS-422 (EIA RS-422-A 標準) 為過去用於 Apple Macintosh 電腦的序列連結。 與 RS-232 參照至接地的非平衡式訊號相反,RS-422 為使用差動電子訊號, 差動傳輸使用 2 個通道,分別用於傳輸與接收訊號,因此相較於 RS-232,其抗擾性更佳,通訊距離也更長。 這些優勢讓 RS-422 更適合用於工業級應用。


什麼是 RS485?

RS-485 (EIA-485 標準) 為 RS-422 的改良版本,從原本的 10 組裝置提高至 32 組裝置,並定義必要的電子特性,以在最大負載下保持適當的訊號電壓。

RS232 連線長度只能50~100 呎(17~33m),一個 Comm Port只能接一台,為因應工廠控制需要,於1993年訂定 RS485

  • 抗雜訊能力提高
  • 距離可達4000 呎 (1333 米) 
  • 同時可控制32個設備
  • 優點 
    1. 比RS232便宜,只使用一個+5V電源, 比RS232用的 ±5V方便 
    2. 網路功能:可長距離、多儀器連結,使用高阻抗的接收器,可接達256 台
    3. 長距離: 1333m
    4. 快速:可達10Mbits/s
      (RS232只能達 ~20Kbits/s)
  • RS485接線法,基本上只有三條線 TRA, TRB, SG 可只使用2線, 須加終端電阻, 每台機器須設不同的位址
  • 終端電阻加在電腦端及最遠一台機器的一端,需搭配導線的阻抗值 (必須大於75ohm),一般而言AWG24線使用(100~150ohm即可)
  • 由於RS232還是PC現有的介面,所以常使用RS232到RS485的轉接器,以便利用RS232控制RS485儀器

什麼是 RS232C?


什麼是 RS232C

RS-232 (ANSI/EIA-232 標準) 為過去 IBM 相容電腦的序列連結功能, 可用以連接滑鼠、印表機或數據機,或用於工業級儀器控制等許多功能。
  • 電腦中最常用的介面之一。 
  • RS-232 : Recommend Standard number 232. 
  • C 表示最新的版本. 
  • 大多電腦都是符合RS-232C一部份標準. 
  • 連線長度只能50~100 呎(17~33m)
  • 一個 Comm Port只能接一台
  • 全功能的 RS-232C 規定使用25-pin D 接頭,使用其中的 22 pins. 
  • 對電腦通訊,大多是不必要的,因此大多數PC只使用一個9pin的公接頭。 
  • 其實,只要使用其中3根pin便可達到全雙工 (full duplex)通訊的目的,一根Send,一根 receive,一根ground
    (Full duplex:送資料與接收資料同時進行,亦即是 雙向的溝通bi-directional)

RS232定義兩種接頭形式,接腳訊號定義不同
  • DCE (data communication Equipment) 
    • 母接頭
    • 資料通訊設備→遠端儀器
  • DTE (data terminal equipment) 
    • 公接頭
    • 資料終端設備→電腦
  • DTE 與DCE可直接一對一連接,
  • 同類間連接需要用Null modem Cable,交換 send 與 receive腳位 

資料如何傳輸 - start bit
  • RS232是屬於序列式的(serial)傳輸資料,資料是一個bit一個bit傳
  • 一般狀態,TD 與RD是在高電位,一端的TD 是接到另端的RD,當有資料要傳時,一 端的TD會先被拉低電位,而另一端的 RD接收到低電位開始接收資料,這個動作叫做送起始位元( Start bit)

接收資料-data bits
  • Start bit後,兩邊的設備開始準備接收資料 
  • 為了溝通,兩邊必須有相同的傳輸速度(baud rate),及有多少 data bits要送
    (Baud rate: 每秒多少bit的傳輸動作)
  • 確定好傳輸速度,接著規定要傳多少bit, 一般是傳8或7 bit,以8 bit最常用。LSB最小位元先送。

資料檢查 Parity bit 
  • 檢查序列資料是否傳得正確?
  • 奇偶檢查 
  • Data bit送完,會再送一個parity bit,讓接收端檢查資料是否正確
  • 有以下幾種: 
    • none:不送parity bit (最常用) 
    • Odd:當data bit有偶數個1時 → 送1補成奇數個 
    • Even :當data bit有奇數個1時 → 送1補成偶數個 
    • Mark:永遠送1做parity bit 
    • Space :永遠送0做parity bit

Stop Bit
  • 停止位元: 將電位拉高,宣告資料已經傳 輸完畢。 
  • 最常用的傳輸格式常記為 8-N-1 8: 
    • 8 data bit 
    • N: No parity bit 
    • 1: 1 start/stop bit
      (設備較慢時用 2bits)

防止資料遺失
  • 使用Handshaking(握手 ) 
    • 可不用 
    • 很多方式
      • 利用某一根線的高低電位 ( 如DTR),當一端準備收資料時先拉高某一線電位,另一端接收到訊息後,才開始送資料
      • 利用TD, RD線,傳送特殊的byte 當成準備接收資料的代號
  • 使用中斷(interrupt)或詢問(polling) 
    • Interrupt:有事件發生時執行 
    • Polling:以軟體不斷檢查資料
  • 使用Acknowledgement(確認 ) 
    • 收到資料時,送回一個特殊byte確認資料收到
  • 錯誤檢查(error checking) 送checksum byte給接收端檢查資料正確性,有問題,通知重送資料

2018年12月10日 星期一

ASP.NET Core 2.0 - JwtBearerEvents


想在 .Net Core 2.0 裡接 jwt 驗證的事件,
比如拿到 token 驗證失敗的 exception,
該怎麼做呢?

建立 CustomJwtBearerEvents 類別,實作 JwtBearerEvents
public class CustomJwtBearerEvents : JwtBearerEvents
{
    private static Logger _logger = LogManager.GetCurrentClassLogger();

    public CustomJwtBearerEvents() : base()
    {}

    public override Task AuthenticationFailed
            (AuthenticationFailedContext context)
    {
        _logger.Error(context.Exception.Message);
        return this.OnAuthenticationFailed.Invoke(context);
    }

    public override Task TokenValidated(TokenValidatedContext context)
    {
        _logger.Trace("OnTokenValidated: " + context.SecurityToken);

        if (something)
        {
            var failMsg = $"Invalid API Token : {jwtToken.RawData}";
            context.Fail(failMsg);
            _logger.Error(failMsg);
                    
        }
        return this.OnTokenValidated.Invoke(context);
    }

    public override Task Challenge(JwtBearerChallengeContext context)
    {
        return this.OnChallenge.Invoke(context);
    }

    public override Task MessageReceived(MessageReceivedContext context)
    {
        return this.OnMessageReceived.Invoke(context);
    }
}

reference: https://www.codeproject.com/Articles/1205160/ASP-NET-Core-Bearer-Authentication

2018年3月28日 星期三

Runtime + Compiler on Vue-Cli 3.0


有需求動態載入 component,
在 jsbin 做簡單的測試是沒問題,
但使用 Vue-Cli 3.0 的開發環境,
卻拋出以下錯誤

You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.

經一番奮鬥後,發現 Vue-Cli 3.0 的 webpack 設定,
預設載入的 Vue 是 vue.runtime.esm.js,
所以在 runtime 的時候會發生此問題,
需將  vue.runtime.esm.js 換成  vue.esm.js
在 run time 期間也有 compiler 可以用

那該怎麼做呢?

在根目錄下設定 vue.config.js 如下即可
 (若沒有此檔,請自行新增!)
module.exports = {
  configureWebpack: {
    resolve: {
      alias: {
        'vue$': 'vue/dist/vue.esm.js'
      }
    }
  }
}


參考來源:

  1. https://github.com/vuejs/vue/tree/dev/dist#explanation-of-build-files
  2. https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md

2018年3月22日 星期四

關閉 Visual Studio 2017 自動編譯 ts 檔


在專案檔加入 <typescriptenabled>true</typescriptenabled>.

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
  </PropertyGroup>


reference:

TypeScriptCompileBlocked

If you are using a different build tool to build your project (e.g. gulp, grunt , etc.) and VS for the development and debugging experience, set true in your project. This should give you all the editing support, but not the build when you hit F5.