Issue with Saving FMU File in FMIExport.jl: "Cannot find a package where this file is stored"

CurioMath
Thu, 03 Oct 2024 12:17:42 +0000
General Usage

Hello,

I am trying to save the FMU file generated using the FMIExport package, as per the examples provided in the Manipulation folder. The following is the Julia code that I used from the example:

using FMI
using FMIExport
using FMICore
using FMIZoo
#import FMIBuild:fmi2Save
originalGetReal = nothing # function pointer to the original fmi2GetReal c-function


# function change to be implemented

# custom function for fmi2GetReal!(fmi2Component, Union{Array{fmi2ValueReference}, Ptr{fmi2ValueReference}}, Csize_t, value::Union{Array{fmi2Real}, Ptr{fmi2Real}}::fmi2Status
# for information on how the FMI2-functions are structured, have a look inside FMICore.jl/src/FMI2_c.jl or the FMI2.0.3-specification on fmi-standard.org
function myGetReal!(c::fmi2Component, vr::Union{Array{fmi2ValueReference}, Ptr{fmi2ValueReference}}, nvr::Csize_t, value::Union{Array{fmi2Real}, Ptr{fmi2Real}})
    global originalGetReal

    # first, we do what the original function does
    status = fmi2GetReal!(originalGetReal, c, vr, nvr, value)

    # if we have a pointer to an array, we must interprete it as array to access elements
    if isa(value, Ptr{fmi2Real})
        value = unsafe_wrap(Array{fmi2Real}, value, nvr, own=false)
    end
    if isa(vr, Ptr{fmi2Real})
        vr = unsafe_wrap(Array{fmi2Real}, vr, nvr, own=false)
    end

    # now, we multiply the position sensor output by two (just for fun!)
    for i in 1:nvr
        if vr[i] == 335544320 # value reference for "positionSensor.s"
            value[i] *= 2.0
        end
    end

    # ... and we return the original status
    return status
end


#overwriting original fun with new fun, after loading fmu


# this function is called, as soon as the DLL is loaded and Julia is initialized
# must return a FMU2-instance to work with
FMIBUILD_CONSTRUCTOR = function(resPath)
    global originalGetReal

    # loads an existing FMU inside the FMU
    fmu = loadFMU(joinpath(resPath, "SpringDamperPendulum1D.fmu"))

    # save, where the original `fmi2GetReal` function was stored, so we can access it in our new function
    originalGetReal = fmu.cGetReal

    # now we overwrite the original function
    fmi2SetFctGetReal(fmu, myGetReal!)

    return fmu
end
import FMIZoo

#path to save fmu


tmpDir = mktempdir(; prefix="fmibuildjl_test_", cleanup=false)
@info "Saving example files at: $(tmpDir)"
fmu_save_path = joinpath(tmpDir, "Manipulation.fmu")

sourceFMU = FMIZoo.get_model_filename("SpringDamperPendulum1D", "Dymola", "2022x")
fmu = FMIBUILD_CONSTRUCTOR(dirname(sourceFMU)) # -> returns desired fmu after implementing changed function

but the issue arises when i run the below code snippet

using FMIBuild
FMIBuild.saveFMU(fmu, fmu_save_path)

this throws the following error,

ERROR: AssertionError: ["fmiBuild(...): Cannot find a package where this file is stored in. For FMU-Export, this source file needs to be inside of a package."]

I would appreciate any help or guidance on how to resolve this issue.

Or else, it would be really helpful if someone can provide me a julia script of simplest case where i can import a fmu, manipulate a single parameter value and then save the manipulated fmu.

Thank you in advance!

4 posts - 3 participants