Delphi+EPICSトラブル集

トラブル

マニュアルは見ない、読まない主義(それなりに正しいと思う)の方のためのTip集。
  1. ca_connectを繰り返すとIOCがハングアップする
  2. しばらく走らせ続けていると、PCがハングアップする
  3. TeeChartの横軸をtimeにしていると0時で軸が前に戻ってしまう
  4. TeeChartの横軸を時間表示にしても軸に値を表示してくれない。
  5. TeeChartのprint priviewの印刷ができない
  6. 画面イメージをJPEGファイルに落としたい
  7. 非力なPCでの問題
  8. ca_task_initialzeとca_task_exit

対応

  1. ca_connectを繰り返すとIOCがハングアップする

    ca_connectをするとIOC上にそのEPICSレコードに対応する構造体が準備されます。 PC側はこの構造体に対してアクセスするので、一度ca_connectしてしまえば同じレコードに対して再びca_connectする必要はありません。これは、IOCをリブートしたときも同じで、勝手に再接続しますのでユーザーコードで同じEPICSレコードに対して2度とca_connectする必要はありません。実際には、ca_connect(に該当する操作)で確保される 構造体は不要になればfreeされるので、何度connectされても害はないはずですが、 freeの部分にバグがいて(EPICSかVxWorksかは不明)、だんだんIOC上のallocated memoryが増えたり、max blockを越えたりしてIOCがお隠れになります。

    結果
    ca_connectを1回だけするようにして、IOCがこけることはなくなった。

  2. しばらく走らせ続けていると、PCがハングアップする

    この現象にはいくつかの原因があったと思われます。

    結果
    TeeChartの再インストール、及びTTimerで動作中の再イベントを禁止することで一応 収まったようです。

  3. TeeChartの横軸をtimeにしていると0時で軸が前に戻ってしまう

    TeeChartのseries.addxyでxをtime関数を使っていると、timeは日付情報をもっていませんので23:59:59...のあと0になってしまいます。timeの代わりにnowを使えば大丈夫です。

    結果
    Timeではなくnowを使えばよい。

  4. TeeChartの横軸を時間表示にしても軸に値を表示してくれない。

    TeeChartのバグっぽいのですが、Chart editorで軸(bottom axis)のlabels/styleで styleをautomaticではなくvalueにしておくとちゃんと表示してくれるようです。なお、 何時何分と表示したいときはlabels/formatをhh:mmとしておきます。

    結果
    横軸のpropertyのlabels/sytleをautomaticでなくvalueにする。

  5. TeeChartのprint priviewの印刷ができない

    TeeChart Pro V5からの新機能でprint preview機能があります。multi chartの場合 preview画面まではちゃんと(でもないが)出ますが、それを印刷しようとすると 一番最初のものしか印刷しません。これについてはSteema社(TeeChart製造元) に問い合わせのmailを出しましたがナシのつぶてです。また、前からある printpartial機能も同じように動作しません。どうもこのあたり、v4であった バグをツブしたおかげで全体にもっとひどいバグがとりついたと思われます。 とりあえず、form全体を.printで印刷することはできますので、うるさいことを 言わなければ我慢できます。

    結果
    未解決。form全体のprintを使えばとりあえずは、なんとかなるかぁ?

  6. 画面イメージをJPEGファイルに落としたい

    single chartの場合はTeeCommanderを使うのが楽です。multi chartの場合、 uses節にjpegユニットを追加し、ついでに次のようなボタンを用意すればできます。 (savePictureDialogをこのフォームに落としておきます)。もっと知りたい 奇特な方はhelpでjpegを探してください。

    procedure THERbcm.SaveJpegClick(Sender: TObject);
    var jp : Tjpegimage;
    begin
      jp := TjpegImage.create;
      try
        with jp do
        begin
          compressionquality := 100;
          Assign(セーブしたいフォーム名.getformimage);
          if savePictureDialog1.execute then
           begin
             SaveToFile(savePictureDialog1.filename) ;
           end;
        end;
      finally
        jp.Free;
      end;
    
    end;
    

    結果
    上のコードをみて考えてくだされ。

  7. 非力なPCでの問題

    非力なPCで無理無理TeeChartてんこ盛り、更新スピード高速なアクセスをすると 色々超常(でもないこともあるが)現象が起きます。ここで非力なPCと言っているのは

    程度のマシンです。これ以上のPC、たとえば では起きない現象です。今までに確認されている症状は また、これ以外に、非力なPCにくそ重いNTかつmulti displayという環境で動かすと、 NTのくせにOSごとくたばることがあるようです。

    結果
    未解決です。解決の見込みもありません。

  8. ca_task_initialzeとca_task_exit

    EPICS channel Access Reference manulaによると、ca_task_initialzeは "Should be called once prior to maing any of the other channel access calls."となっており、ca_task_exitは"Performed automatically at task (or process) exit."となっています。実はca_task_initialzeなしのコードを 間違って作ってしまい、動かしていたことがありますが、不思議なことに特には 問題なく動いてしまいました。とはいっても、なかでmallocとかしているようですから、 安全のためにもform createのときに初めにca_task_initializeはすべきでしょう。 ca_task_exitについては本当にしなくて良いのか分かりません。

    結果
    まあ、マニュアルに従うのが安全ですね。


Makoto Tobiyama
Last update: 31/May/2001