C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: FatalExecutionEngineError


(過去ログ 174 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■100157 / inTopicNo.1)  FatalExecutionEngineError
  
□投稿者/ 初心者HK (1回)-(2022/07/07(Thu) 16:49:19)

分類:[VB.NET/VB2005 以降] 

windows10 VisualStudio2019 VB.NET .NETFramework4.7.2

以上の環境で三菱電機のシーケンサーと通信し、特定のデバイスからデータを読み込み、
そのデバイスのデータを2進数に変換(0000000000000000)し、
そのうちの特定の1ビットがONになればブザーと赤色の表示がでる。
OFFになればブザーと赤色の表示が消える。

ONの時にボタンをクリックすればブザーが消える。
というプログラムを作成しました。

途中までは順調に動くのですが、30〜60分経過すると必ずエラーが発生し、落ちてしまいます。

エラー内容は以下になります。
マネージド デバッグ アシスタント 'FatalExecutionEngineError' 
  Message=マネージド デバッグ アシスタント 'FatalExecutionEngineError' : 'ランタイムの重大なエラーが発生しました。エラーのアドレスは 0x67367f25、スレッド 0x7384 です。エラー コードは 0xc0000005 です。これは CLR のバグであるか、またはユーザー コードのアンセーフまたは確認不可能な部分にバグがある可能性があります。このバグの一般的な原因には、スタックが壊れる可能性のある COM-interop または PInvoke のユーザー マーシャリング エラーが含まれています。'

コードは以下になります。

Public Class Form1
    Public IRet As Long
    Public DataX(0) As Integer
    Public flg1 As Integer
    Public flg2 As Integer
    Public flg3 As Integer
    Public flg4 As Integer
    Public flg5 As Integer
    'Public flg6 As Integer
    Public X16to2 As Integer
    Public XtoSt As String

    Private Sub Timer1_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Timer1.Tick


        IRet = AxActUtlType1.Open()

        'X20のデバイスブロックの16ビット分にDataX(0)として格納したデータを読み込む
        IRet = AxActUtlType1.ReadDeviceBlock("X20", 16, DataX(0))
        If IRet <> 0 Then Exit Sub

        'DataX(0)16進数を2進数に変換
        X16to2 = Convert.ToString(DataX(0), 2)
        XtoSt = Format(X16to2, "0000000000000000")
        TextBox1.Text = XtoSt 'テスト用

        'XtoStの左から13番目が1であれば警報
        If Mid(XtoSt, 13, 1) = "1" Then
            If flg1 = 0 Then
                Console.Beep(1500, 1000)
            End If
            RectangleShape1.BackColor = System.Drawing.Color.Red
            Label1.BackColor = System.Drawing.Color.Red
        Else
            flg1 = 0
            RectangleShape1.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
            Label1.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
        End If

        If Mid(XtoSt, 12, 1) = "1" Then
            If flg2 = 0 Then
                Console.Beep(1500, 1000)
            End If
            RectangleShape2.BackColor = System.Drawing.Color.Red
            Label2.BackColor = System.Drawing.Color.Red
        Else
            flg2 = 0
            RectangleShape2.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
            Label2.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
        End If

        If Mid(XtoSt, 11, 1) = "1" Then
            If flg3 = 0 Then
                Console.Beep(1500, 1000)
            End If
            RectangleShape3.BackColor = System.Drawing.Color.Red
            Label3.BackColor = System.Drawing.Color.Red
        Else
            flg3 = 0
            RectangleShape3.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
            Label3.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
        End If

        If Mid(XtoSt, 10, 1) = "1" Then
            If flg4 = 0 Then
                Console.Beep(1500, 1000)
            End If
            RectangleShape4.BackColor = System.Drawing.Color.Red
            Label4.BackColor = System.Drawing.Color.Red
        Else
            flg4 = 0
            RectangleShape4.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
            Label4.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
        End If

        If Mid(XtoSt, 9, 1) = "1" Then
            If flg5 = 0 Then
                Console.Beep(1500, 1000)
            End If
            RectangleShape5.BackColor = System.Drawing.Color.Red
            Label5.BackColor = System.Drawing.Color.Red
        Else
            flg5 = 0
            RectangleShape5.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
            Label5.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
        End If

        If Mid(XtoSt, 8, 1) = "1" Then
            'If flg6 = 0 Then
            'Beep()
            'End If
            RectangleShape6.BackColor = System.Drawing.Color.Yellow
            Label6.BackColor = System.Drawing.Color.Yellow
        Else
            'flg6 = 0
            RectangleShape6.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
            Label6.BackColor = System.Drawing.SystemColors.GradientInactiveCaption
        End If



    End Sub



    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        If flg1 = 0 Then flg1 = 1
        If flg2 = 0 Then flg2 = 1
        If flg3 = 0 Then flg3 = 1
        If flg4 = 0 Then flg4 = 1
        If flg5 = 0 Then flg5 = 1
        'If flg6 = 0 Then flg6 = 1
    End Sub

End Class

エラーが発生する原因について何が考えられそうでしょうか。
よろしくお願い致します。

引用返信 編集キー/
■100165 / inTopicNo.2)  Re[1]: FatalExecutionEngineError
□投稿者/ 魔界の仮面弁士 (3430回)-(2022/07/07(Thu) 20:26:07)
No100157 (初心者HK さん) に返信
> マネージド デバッグ アシスタント 'FatalExecutionEngineError'
> エラー コードは 0xc0000005 です。

例外コード 0xC0000005 で異常終了したということは、アプリケーションが
誤って不当なメモリ領域にアクセスした…ということですね。

API 利用時の実装ミスや、COM コンポーネントの不具合などの巻き添えで
クラッシュに至っている可能性があります。


> 以上の環境で三菱電機のシーケンサーと通信し、
ググってみた感じ、MX Component というやつですかね?

三菱のシーケンサーのマニュアルは、会員登録しないと閲覧できないようなので、
仔細までは調べていませんが、AxActUtlType1 とは "Ax何某"という名前からして、
ActiveX (COM) コンポーネントなのですよね?

今回作成したアプリケーションは、
 x64 ビルド
 x86 ビルド
 AnyCPU ビルド
 AnyCPU(32bit 優先)ビルド
のいずれになっていますか?
COM 側が 32bit/64bit いずれを想定しているかによって、
プロジェクトの設定を合わせる必要がありますが、その点は大丈夫でしょうか。


> Public IRet As Long
この手の変数を、何故ローカル変数としてではなく、
フィールド変数で保持しているでしょう…? まぁ良いですけど。


> IRet = AxActUtlType1.Open()
> IRet = AxActUtlType1.ReadDeviceBlock("X20", 16, DataX(0))
変数のデータ型を As Long として宣言されていますが、
これらのメソッドの戻り値は、本当に 64bit 整数型なのでしょうか。
実際は、As Integer な 32bit 整数型を返す仕様だったりはしないでしょうか。

コードを見る限り、Format や Mid といった、VBA 時代の互換命令が多用されているので、
VBA コードを VB.NET 化する時点での翻訳ミスを含んでいるのではないかと訝しんでいます。
VB6 や VBA における As Long は、VB.NET では As Integre に相当しますので…。
(VB.NET で As Long と書いた場合、VBA では As LongLong に相当します)


> RectangleShape3.BackColor = System.Drawing.Color.Red
RectangleShape ということは、Microsoft Visual Basic PowerPacks をお使いのようですね。
これは止めた方が良いでしょう。

PowerPacks には幾つかのバージョンがありますが、いずれのバージョンも
VS2019/2022 での利用は避けてください。PrintForm 等については使えるのですが、
シェイプ系については、VS2019 から WinForms デザイナーの仕様が刷新されたため、
残念ながら正しく動作しないことが知られています。シェイプ系については、
面倒でも Paint イベントで自前描画するなどして代用してください。


VS2005 → PowerPacks 2.0 もしくは 3.0 をダウンロードして使えます。(公開終了)
VS2008 → VS2008 SP1 に付属の PowerPacks 1.2 を使えます。(Microsoft.VisualBasic.PowerPacks.Vs 9.0)
VS2010 → VS2010 に同梱されている PowerPacks 10.0 を使えます。(Microsoft.VisualBasic.PowerPacks.Vs 10.0)
VS2012 → VS2012 に同梱されている PowerPacks 11.0 を使えます。(Microsoft.VisualBasic.PowerPacks.Vs 11.0)
VS2013 → PowerPacks 12.0 をダウンロードして使う。(Microsoft.VisualBasic.PowerPacks.Vs 12.0)
VS2015/2017 → PowerPacks の更新は終了しました。(既存のバージョンを使うことはできます)
VS2019/2022 → PowerPacks は使用しないでください。

なお、v12.0 は CLR4 ベース(ランタイムバージョン v4.0.30319)、
それ以外の物は CLR2 ベース(ランタイムバージョン v2.0.50727)です。

2019/2022 でも、v3.0 などの過去バージョンであればシェイプを使える可能性が
ありますが、安定動作を求めるのであれば、推奨できるものではありません。
引用返信 編集キー/
■100166 / inTopicNo.3)  Re[1]: FatalExecutionEngineError
□投稿者/ KOZ (268回)-(2022/07/07(Thu) 21:08:16)
2022/07/08(Fri) 01:09:12 編集(投稿者)
No100157 (初心者HK さん) に返信
> windows10 VisualStudio2019 VB.NET .NETFramework4.7.2

ActiveX コンポーネント + Visual Basic PowrPacks + .NET Framework 4.7.2 ですか・・・
.NET Framework 3.5 という選択肢はなかったんでしょうか?

>         IRet = AxActUtlType1.Open()

Open() があるのに Close() が見当たりませんが大丈夫ですか?

>         'X20のデバイスブロックの16ビット分にDataX(0)として格納したデータを読み込む
>         IRet = AxActUtlType1.ReadDeviceBlock("X20", 16, DataX(0))
>         If IRet <> 0 Then Exit Sub

エラーが発生したら Close() しないで抜けてしまいますが、大丈夫ですか?

https://www.mitsubishielectric.co.jp/fa/download/software/detailsearch.do?mode=software&kisyu=/plc_fx&shiryoid=0000000028&lang=1&select=0&softid=1&infostatus=2_5_1&viewradio=0&viewstatus=&viewpos=

上のページからダウンロードできる 「MX Component Version 4 プログラミングマニュアル」の 354〜355ページに

■Visual Basic .NET
IRet = object.ReadDeviceBlock(szDevice, iSize, iData(0))

Integer  IRet       戻り値               Output
String   szDevice   デバイス名           Input
Integer  iSize      読出し点数           Input
Integer  iData(n)   読み出したデバイス値 Output

説明
・szDevice(varDevice)にて指定したデバイスから,lSize(varSizeまたはiSize)分のデバイス値を一括して読み出します。
・読み出したデバイス値は,lData(lplData,lpvarData,またはiData)に格納されます。
・lData(lplData,lpvarData,またはiData)は,lSize(varSizeまたはiSize)以上の配列を確保してください。

とあります。

Public DataX(0) As Integer

では足りないのでは?

ざっと見た感じ、配列の数は1つだけで良さそうなので

  IRet = AxActUtlType1.ReadDeviceBlock("X20", 1, DataX(0))

とするといいんじゃないでしょうか。

引用返信 編集キー/
■100174 / inTopicNo.4)  Re[2]: FatalExecutionEngineError
□投稿者/ 初心者HK (2回)-(2022/07/08(Fri) 15:36:59)
No100165 (魔界の仮面弁士 さん) に返信
> ■No100157 (初心者HK さん) に返信

ご返信ありがとうございます。

> 今回作成したアプリケーションは、
>  x64 ビルド
>  x86 ビルド
>  AnyCPU ビルド
>  AnyCPU(32bit 優先)ビルド
> のいずれになっていますか?
> COM 側が 32bit/64bit いずれを想定しているかによって、
> プロジェクトの設定を合わせる必要がありますが、その点は大丈夫でしょうか。

おっしゃる通り、三菱のマニュアルでは「ユーザプログラムを作成する場合,ターゲットCPUは"x86"(32ビット)を選択してください。」
とありましたが、にもかかわらずAnyCPU ビルドとなっておりました。修正します。

>>Public IRet As Long
> この手の変数を、何故ローカル変数としてではなく、
> フィールド変数で保持しているでしょう…? まぁ良いですけど。

すいません。会社のプログラムがほとんどVB6で一人の方が作ったものでして、そちらを参照しながら手探りでやっており基本が全くなっていない状態です。。その方もVB.NETに関してはよくわからないと申しているのでネットで検索しながら作っております。
やはり基本をどこか、なにかしらで学ばないといけないと感じております。

他の点に関しても見直しをさせて頂きます。
本当にどうにも行き詰った中でこちらの掲示板に助けを求めまして、
ここまで適切にお返事を下さって本当に感謝しかありません。
ありがとうございます。
引用返信 編集キー/
■100176 / inTopicNo.5)  Re[2]: FatalExecutionEngineError
□投稿者/ 初心者HK (3回)-(2022/07/08(Fri) 16:14:14)
No100166 (KOZ さん) に返信
> 2022/07/08(Fri) 01:09:12 編集(投稿者)
>
> ■No100157 (初心者HK さん) に返信

返信ありがとうございます。
>
> ActiveX コンポーネント + Visual Basic PowrPacks + .NET Framework 4.7.2 ですか・・・
> .NET Framework 3.5 という選択肢はなかったんでしょうか?

この辺りのことに関しても知識が無くなんとなく選んでしまっていました。。

>> IRet = AxActUtlType1.Open()
>
> Open() があるのに Close() が見当たりませんが大丈夫ですか?

大丈夫じゃなさそうです。ありがとうございます。追加します。


> IRet = AxActUtlType1.ReadDeviceBlock("X20", 1, DataX(0))
>
> とするといいんじゃないでしょうか。

まさにここが原因であったようです。こちらに修正したところエラーの発生が無くなりました。
本当にありがとうございます。
頼れるところが無く、途方に暮れてましたが、親切にお答え下さったお陰で解決できそうです。
他にもまだまだ問題点はあるので、皆さんのメッセージを参考に手を加えていきたいと思います。
本当にありがとうございました。
解決済み
引用返信 編集キー/
■100178 / inTopicNo.6)  Re[3]: FatalExecutionEngineError
□投稿者/ KOZ (269回)-(2022/07/08(Fri) 16:54:16)
2022/07/08(Fri) 16:59:28 編集(投稿者)
No100176 (初心者HK さん) に返信

解決して良かったです。
ところでコーディングについて2つほど指摘させてください。

(1) メソッドを分けて見通しよく

ラベルや RectangleShape の色を変えたり、音を鳴らす部分は別のメソッドにしたほうがいいかと思います。

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    IRet = AxActUtlType1.Open()
    If IRet <> 0 Then Return
    Try
        IRet = AxActUtlType1.ReadDeviceBlock("X20", 1, DataX(0))
        If IRet <> 0 Then
            Return ' ここで抜けても Finally ブロックで Close が実行される
        End If
        SetControls()
    Finally
        AxActUtlType1.Close()
    End Try
End Sub

のようにして、Sub SetControls の中に書きます。

(2) 同じような繰り返し処理はまとめる

Beep 音を鳴らす、フラグをゼロクリアする、色を変えるという一連の処理はまとめることが出来そうです。

Private Sub SetRepeat(index As Integer, ByRef flg As Integer, shape As RectangleShape, label As Label)
    If Mid(XtoSt, index, 1) = "1" Then
        If flg = 0 AndAlso index <> 8 Then ' index が 8 のときは音を鳴らさない
            Console.Beep(1500, 1000)
        End If
        shape.BackColor = Color.Red
        label.BackColor = Color.Red
    Else
        flg = 0
        shape.BackColor = SystemColors.GradientInactiveCaption
        label.BackColor = SystemColors.GradientInactiveCaption
    End If
End Sub

これを、先ほどの SetControls の中から呼び出します。
(flg6 もコメントアウトを解除します。)

Private Sub SetControls()
    'DataX(0)16進数を2進数に変換
    X16to2 = Convert.ToString(DataX(0), 2)
    XtoSt = Format(X16to2, "0000000000000000")
    TextBox1.Text = XtoSt 'テスト用
    SetRepeat(13, flg1, RectangleShape1, Label1)
    SetRepeat(12, flg2, RectangleShape2, Label2)
    SetRepeat(11, flg3, RectangleShape3, Label3)
    SetRepeat(10, flg4, RectangleShape4, Label4)
    SetRepeat(9, flg5, RectangleShape5, Label5)
    SetRepeat(8, flg6, RectangleShape6, Label6)
End Sub


解決済み
引用返信 編集キー/
■100236 / inTopicNo.7)  Re[4]: FatalExecutionEngineError
□投稿者/ 初心者HK (4回)-(2022/07/12(Tue) 17:31:52)
No100178 (KOZ さん) に返信
> 2022/07/08(Fri) 16:59:28 編集(投稿者)
>
> ■No100176 (初心者HK さん) に返信
>
ご指摘ありがとうございます!
確かにこのようにした方が見通し良くまとまった書き方となっていると存じます。
このような書き方の型がなく、自己流の上司のコードを参考にさらに自己流でコーディングしている状況ですので、
指摘していただけるのはありがたいです。

こちらのコーディングを参考に今後の事案にも対応していきたいと思います。
ありがとうございます。
引用返信 編集キー/
■100276 / inTopicNo.8)  Re[5]: FatalExecutionEngineError
□投稿者/ KOZ (292回)-(2022/07/14(Thu) 23:09:24)
No100236 (初心者HK さん) に返信
> こちらのコーディングを参考に今後の事案にも対応していきたいと思います。
> ありがとうございます。

がんばってください。

解決済みチェックが外れているのでつけておきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -